随笔分类 -  LeetCode

摘要:4. 寻找两个有序数组的中位数 题意 给定两个拍好序的数组,求两个数组合并后的中位数。 解题思路 归并排序:将多个需要排序的数组合并成最终的数组,然后求中位数,那么它的时间复杂度则为(n+m)log(n+m)*,而题目的要求是log(n+m),可以看出应该是使用二分法来查找,较小的一方会直接丢弃掉; 阅读全文
posted @ 2017-08-20 12:19 banananana 阅读(146) 评论(0) 推荐(0)
摘要:152. Maximum Product Subarray 前提:一开始没有想到DP,而是想到了用递归,为了要考虑到可能会出现多个负数,基本上是遍历每一种情况,很是复杂。 假定dp[i]表示从起始到该下标的乘积的最值。 思路:我们需要使用两个dp,一个纪录最小值,一个纪录最大值,相互利用更新得到最小 阅读全文
posted @ 2017-08-20 04:57 banananana 阅读(148) 评论(0) 推荐(0)
摘要:64. Minimum Path Sum 题意:计算从起始结点到终点结点的路径之和,使其相对最小。 假定dp[i][j]表示到达该位置的最小的和 分析:如果在第一行或者第一列,因为没有别的路可以选择,所以其和没有最小只说,只能进行累加;而其它的情况则可以通过上一个结点和左边一个结点的比较取其相对较小 阅读全文
posted @ 2017-08-20 02:59 banananana 阅读(112) 评论(0) 推荐(0)
摘要:63. Unique Paths II 分析:在原来I的基础之上加上了障碍物,所以只需要碰见障碍物就将该路径置为0,如果是第一行或者第一列存在障碍物,那么在障碍物之后的数就都为0,因为根本不可能到达。 状态转移方程为: 动态规划 class Solution(object): def uniqueP 阅读全文
posted @ 2017-08-20 02:28 banananana 阅读(137) 评论(0) 推荐(0)
摘要:62. Unique Paths 题意:计算从起点到终点有多少中可能的路径(只能走右边和下边)。 首先是分析状态转移方程,假定dp[i][j]表示到达该位置路径的个数。 分析如下:在第一行和第一列的表格中,因为其只能走固定的右边和下边,则其该行和该列上的值都只有一种走法,所以其值都为1,接下来看其它 阅读全文
posted @ 2017-08-20 01:45 banananana 阅读(103) 评论(0) 推荐(0)
摘要:54. Spiral Matrix 题意:螺旋打印二维矩阵 1. 正常做法 直接按照螺旋的思想一个个打印出来。 class Solution(object): def spiralOrder(self, matrix): """ :type matrix: List[List[int]] :rtyp 阅读全文
posted @ 2017-08-20 01:03 banananana 阅读(207) 评论(0) 推荐(0)
摘要:48. Rotate Image 翻转二维数组,这分为顺时针和逆时针,分别如下: 1. 顺时针 ''' clockwise rotate first reverse up to down, then swap the symmetry 1 2 3 7 8 9 7 4 1 4 5 6 => 4 5 6 阅读全文
posted @ 2017-08-19 15:52 banananana 阅读(127) 评论(0) 推荐(0)
摘要:621. Task Scheduler 这道题让你计算执行一系列任务所耗费的时间,根据题目要求,安排每个相同的任务之间需要经历n个空档,在这n个空档中,你可以安排其它的任务,你也可以设置为空闲。 举个例子,AAABBC,3,过程如下: 我们可以发现总的时间为,三个A之间相互的距离再加上最后一个A的时 阅读全文
posted @ 2017-08-19 15:12 banananana 阅读(149) 评论(0) 推荐(0)
摘要:40. 组合总和 II 题意 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。解集不能包含重复的组合。 阅读全文
posted @ 2017-08-19 11:43 banananana 阅读(119) 评论(0) 推荐(0)
摘要:34. Search for a Range 因为题目直接就要求时间复杂度为logn,所以很明显是二分查找,注意这个二分查找需要左右两边,不然长度为1的数组无法进入。 我一开始的做法,是通过二分法找到相应的值,在遍历找到最左边和最右边的相同值,但这个有个问题,就是遍历可能会造成O(n)的时间复杂度( 阅读全文
posted @ 2017-08-19 09:37 banananana 阅读(157) 评论(0) 推荐(0)
摘要:31. Next Permutation 题意:计算下一个比当前排列构成的值要大的排列。 这有个算法: 以1,2,3为例,执行过程如下: 1,3,2(最后一个升序下标为0,即1,最后一个比1要大的是2) -> 2,3,1 -> 2,1,3(反转) import bisect class Soluti 阅读全文
posted @ 2017-08-19 04:41 banananana 阅读(130) 评论(0) 推荐(0)
摘要:18. 4Sum 思路:先排序(要使用Two Pointers必须排序),然后选择两个结点,剩下的两个结点通过Two Pointers来决定。 class Solution(object): def fourSum(self, nums, target): """ :type nums: List[ 阅读全文
posted @ 2017-08-19 03:07 banananana 阅读(123) 评论(0) 推荐(0)
摘要:16. 3Sum Closest 思路:先进行排序(不然后面的两个指针不知道怎么移动),选中一个,再利用Two Pointers选择剩下的两个数,如下: class Solution(object): def threeSumClosest(self, nums, target): """ :typ 阅读全文
posted @ 2017-08-19 01:45 banananana 阅读(117) 评论(0) 推荐(0)
摘要:11. Container With Most Water 没看清楚题目,题中让选中两条线,使其能够装下最多的水。 思路如下: class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: 阅读全文
posted @ 2017-08-19 00:42 banananana 阅读(149) 评论(0) 推荐(0)
摘要:不会做 1. Path Sum class Solution(object): def hasPathSum(self, root, sum): """ :type root: TreeNode :type sum: int :rtype: bool """ if root is None: ret 阅读全文
posted @ 2017-08-05 15:51 banananana 阅读(230) 评论(0) 推荐(0)
摘要:不会做 1. Smallest Range 这道题我一开始的想法是错误的,以为是求由数组中的所有数字中构成的最小区间,但是因为没有考虑到无法保证这个区间包含了所有的子数组中的至少一个元素,所以错误,同时还因为不断的缩小范围,最后发现计算出来的和答案完全是两个不交集的区间,原因在于你缩小的是整体的区间 阅读全文
posted @ 2017-08-05 15:49 banananana 阅读(275) 评论(0) 推荐(0)
摘要:优化 Increasing Subsequences 题意:找出数组里面生序的子序列(按顺序) 这道题我一开始想到的就是DFS,先选择数组的一个值,作为跟,然后往数组下面进行递归,思路不错,但是TLE。 class Solution(object): def findSubsequences(sel 阅读全文
posted @ 2017-08-05 15:48 banananana 阅读(288) 评论(0) 推荐(0)
摘要:不会做 1. Search in Rotated Sorted Array 这道题的目的不在于解决它,而是如何更快的解决,这要求更低的时间复杂度,因此任何时间复杂度为n的方案应该都要被否决掉,只有n/2的解决方案才能被留下来。 这题不能简单的用二分查找的方式来做,因为它并不知道那个旋转的点在哪,因此 阅读全文
posted @ 2017-08-05 15:48 banananana 阅读(343) 评论(0) 推荐(0)
摘要:不同的做法 优化 1. 546. Remove Boxes 这是一开始的做法,直接用DFS来做,显然TLE class Solution(object): result = 0 def recursive(self, boxes, cur): l = len(boxes) if l == 0: if 阅读全文
posted @ 2017-08-05 15:47 banananana 阅读(209) 评论(0) 推荐(0)
摘要:不同的做法 1. 56. Merge Intervals 这是我的做法,AC,通过反向删除intervals中的值实现,注意在删除的时候删除前面那个,这样数组重新排序后,数组仍然会从最后一位和前面的比较进行比较。如果要反向的话,需要按照后者进行排序。 class Solution(object): 阅读全文
posted @ 2017-08-05 15:45 banananana 阅读(206) 评论(0) 推荐(0)