![](https://img-blog.csdnimg.cn/69b7e70fc81847e8a614d5dc735f0602.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
leetCode
刷题记录
今天不标数据的小wu
这个作者很懒,什么都没留下…
展开
-
LeetCode 454 python 优化历程
尝试解题1使用两个列表分表保存nums1与nums2的和、nums3与num4的和遍历这两个列表找到相加为和的个数,即为最后结果超时 21/132class Solution: def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: L_12 = [] L_34 = [] for nu.原创 2022-01-12 15:55:06 · 446 阅读 · 0 评论 -
LeetCode 452 python贪心
题解:贪心算法分别设置两个参数l, r(分别表示区间的左端点和右端点),初始化l=points[0][0],r=points[0][1], res=1(有一个气球就需要一个箭),从下标1开始,遍历points,用(s,e)表示,每一次只保留最小的重叠区间,具体做法是,首先判断上一步保存的最小重叠区间[l,r]是否与当前区间重叠,若r>=s,则有重叠,重叠部分为:最大左端点l = max(l, s)和最小右端点r = min(r, e),[l,r]更新为当前的重叠空间若r<s,则没有重.原创 2022-01-12 09:28:57 · 317 阅读 · 0 评论 -
LeetCode 436 python 哈希表
题解:因为测试实例的长度为2*10**4,因此,算法复杂度不能超过nlogn。注意:题意是比较大于等于endi的最小startj,且i,j有可能相等因为每个starti都不同,因此,为方便后续比较,可用哈希表记录每个区间的下标, 使用一个等长的返回数组将intervals按降序顺序排列顺序遍历intervals的s,e,只需将e与当前intervals区间以及之间区间的s进行比较,并且逆序遍历之前的区间,这样方便找比e大且最小的s。找到了下标就利用哈希表添加至相应的位置,没找到就在相应的位置添加.原创 2022-01-11 16:24:05 · 487 阅读 · 0 评论 -
LeetCode 435 python 贪心
解析:贪心算法首先对intervals排序,这一步使每个区间的左端点按顺序排列,每一个interval区间的左端点是小于等于下一个interval区间的左端点保证遍历过的每个区间都是不重叠的,也即,上一个interval区间的右端点必须小于等于下一个interval区间的左端点使用变量last_num 表示已遍历过的无重叠的最后一个区间的右端点,初始化last_num为第一个interval区间的右端点,从第二个interval区间开始遍历intervals,比较last_num与当前interv.原创 2022-01-11 14:57:29 · 148 阅读 · 0 评论 -
LeetCode 417 python dfs
解析:深度优先搜索,从左到右,从上到下,若board[i][j] 为‘X’,战舰数目加一。则继续向下或向右(不继续向上或向左是因为左边的和上边的位置已经遍历过了,若是有战舰相邻,则该位置必不为‘X’),记录一个索引,board[i][j]为始,保持该位置符号不变,继续向下或向右搜索,若有相邻战舰,则相邻战舰位置符号变为‘.’,这样做救恩那个保证最后甲板上只有不相邻的战舰位置符号为’X’,其余位置为’.’,在遍历的过程中同时计数。class Solution: def countBattlesh.原创 2022-01-07 17:32:14 · 640 阅读 · 0 评论 -
LeetCode 416 python 一维数组动态规划
一维数组动态规划题目要求将数组分为两个相等子集的和,那么如果为真,那么这个数组的总和必定是偶数(条件一),且该数组的最大值必不大于该数组和的一半(条件二)。那么该问题即可转化为求解和为是否有和为total = sum(nums) // 2的子数组问题。使用一维数组dp = [False] * (total+1),边界条件:当和为0时,必为真,则dp[0] = True例:求解和为i (i = (1,2,…total)),首先遍历每个num in nums,且,为防止重复,i必须逆序遍历。状态转.原创 2022-01-07 15:14:43 · 886 阅读 · 1 评论 -
LeetCode 414 python O(n)
因为时间复杂度未O(n),因此不能使用排序设3个负无穷的变量a,b,c,依次为当前遍历过的序列中最大、第二大、第三大的数当前元素nums[i]依次与a,b,c比较,若nums[i]大于a,则更新a,b,c,因为最大的值变为了nums[i],那么之前的最大变成了第二大,之前的第二大变成了第三大。同理,若nums[i]大于b,则更新b,c,因为第二大的值变为了nums[i],之前的第二大变成了第三大。若nums[i]大于c,则更新c,第三大的值变成了nums[i]。若有重复元素,则跳过。class S.原创 2022-01-06 17:07:18 · 444 阅读 · 0 评论 -
LeeCode 413 python 详解
贪心算法变量l记录当前遍历位置之前最长的等差数列,每次中断则计算子等差序列中所有的子数组,计算方式为:res = l - k + 1 (k = 3,4,…l) res为子等差序列中所有大于等于3 小于等于l的子数组若中断,则l从零开始等差数列的遍历从下标1开始到下标n-2结束,若任意两个相邻元素之差相同,且l=0 则l+3,否则l+1,例如[1,2,3,4], 初始l=0,从2开始,2满足条件,则l+=3(表示当前子序列为1,2,3),3满足条件,则l+=1(把4的长度加到子序列中)。边界条件.原创 2022-01-06 16:28:38 · 280 阅读 · 0 评论 -
LeetCode 380
删除、插入均为二分查找import randomclass RandomizedSet: def __init__(self): self.nums = [] def insert(self, val: int) -> bool: l = 0 r = len(self.nums)-1 while l <= r: mid = (l + r) // 2 if s.原创 2022-01-04 16:56:36 · 285 阅读 · 0 评论 -
LeetCode 376
题解:使用贪心算法:记住当前摆动序列的最后一个元素b,明确下一次运算应该大于当前这个元素(conti=True)还是小于这个元素(conti=False)。分四种情况如果conti=True,nums[i] < b,那么b=nums[i],因为后面的元素更容易大于一个较小的元素,所以conti=True接着比较找更大的数字;如果conti=False,nums[i] > b,那么b=nums[i],因为后面的元素更容易小于一个较大的元素,所以conti=False接着比较找更大的数字;如.原创 2022-01-04 10:46:18 · 209 阅读 · 0 评论 -
Leetcode 846
class Solution: def isNStraightHand(self, hand: List[int], groupSize: int) -> bool: n = len(hand) if n % groupSize != 0: # 须得满足牌的个数是分组的倍数 return False d = {} hand.sort() # 排序 L = [] .原创 2021-12-30 16:24:11 · 245 阅读 · 0 评论 -
Leecode 221
原本以为这又是一道需要dfs的题,没想到行不通,最后找到一种思路——使用动态规划。将所有的str转为int如图所示:蓝圈所指位置是正方形的右下角位置,若能组成正方形,则该位置的左上方所有位置都得是1.由上图可得公式:matrix[i][j] = min(matrix[i-1][j-1], matrix[i-1][j], matrix[i][j-1]) + 1只计算边长,最后返回边长的平方即为面积。class Solution: def maximalSquare(self, ma.原创 2021-12-11 21:37:23 · 126 阅读 · 0 评论 -
Leecode 54
题目解析:确定四个边界(上、下、左、右),确定螺旋轨迹是先右后下再左然后往上,所以按照轨迹,只要没有达到边界就一直走,达到边界之后就换个方向,class Solution(object): def spiralOrder(self, matrix): """ :type matrix: List[List[int]] :rtype: List[int] """ i = 0 j = 0 ..原创 2021-10-11 17:37:51 · 86 阅读 · 0 评论 -
Leecode 55
使用贪心算法,设置每一步能够跳跃的起始位置和结束位置,计算每一步最远可以达到的位置,如果当前这一步能够走完数组就返回True,如果走完了所有的数组,都没有达到最远的位置,则返回False,在跳跃的过程中,如果当前跳跃的起始位置与结束位置相等,则表示当前位置是能达到的最远位置,比如[0, 1],从第一个位置,只能跳到第一个位置。class Solution(object): def canJump(self, nums): """ :type nums: List[.原创 2021-10-11 17:48:21 · 65 阅读 · 0 评论 -
Leecode 56
题目解析:先对若干个区间排序,那么所有区间的起始值必然是从小到大的,而只要保证当前每一步的结束值是最大的就行了。这时候就要用到贪心算法,依次遍历每一个区间,当前一时刻的结束值大于等于当前区间的起始值时,则比较前一时刻的结束值与当前区间的结束值,保存最大的结束值,并标记从这一区间开始已经重叠了,而当前一时刻的结束值小于当前区间的起始值时,则根据是否重叠区间,将前一时刻的起始值和结束值保存下来。class Solution(object): def merge(self, intervals):.原创 2021-10-12 15:39:36 · 62 阅读 · 0 评论 -
Leecode 57
参考上一题 leecode原创 2021-10-13 21:01:47 · 69 阅读 · 0 评论 -
Leecode 59
题目解析:与leecode 54一样的思路,只不过后者是输出,前者是填入。与后者相比,螺旋矩阵II需要提前初始化一个全为0的n*n的二维数组,并且设置一个标量初始值为1,每走一步就加1,并将其填入每一步的位置。class Solution(object): def generateMatrix(self, n): """ :type n: int :rtype: List[List[int]] """ L = [[.原创 2021-10-14 10:37:25 · 66 阅读 · 0 评论 -
Leecode 62
题目解析:题目中机器人只能向下或向右移动,画个简单的图示意,由上图可见,绿色的点可由两条路径到达,一个是从上面那条蓝色的点路径,一个是从左边那条紫色的点路径,同样地,蓝色的点也可由上面一条白色的点路径和左边一条红色的点路径到。。。依次,可以发现一个位置可以由左边路径到达也可由上边路径到达,那能够达到这个位置的路径就是左边路径与上面路径的和!接下来写代码实现就行了。class Solution(object): def uniquePaths(self, m, n): """.原创 2021-10-17 15:05:19 · 76 阅读 · 0 评论 -
Leecode 63
题目解析:与Leecode 62一样的思路,只是有了障碍物之后,这个位置及其之前的路径都为0,也即此路不通。路径矩阵(obstacleGrid)第一行第一列在没有障碍物的时候同一初始化为1,有障碍物时障碍物位置及其之后的位置为0边界条件:如果起始位置有障碍物,则起始位置为0其他位置判断是否存在障碍物,如果存在那该位置的路径为0,否则就是左边位置路径与上边位置路径的和class Solution(object): def uniquePathsWithObstacles(self, obs.原创 2021-10-18 15:52:42 · 84 阅读 · 0 评论 -
Leecode 64
题目解析:每一个位置的路径和 = min(左边经过的路径, 上边经过的路径),加上当前走过的路径。class Solution(object): def minPathSum(self, grid): """ :type grid: List[List[int]] :rtype: int """ m, n = len(grid), len(grid[0]) for i in range(1, n):.原创 2021-10-19 13:56:45 · 85 阅读 · 0 评论 -
Leecode 71
class Solution(object): def simplifyPath(self, path): """ :type path: str :rtype: str """ # 依照规则写条件代码 path_list = path.split('/') # 将路径以‘/’为分隔符分为列表格式,作为一个一个的操作符 res = [] res.append('/') .原创 2021-10-26 16:03:09 · 96 阅读 · 0 评论