数组(Array)
LeetCode中,Array分类题解
朱师傅哈
这个作者很懒,什么都没留下…
展开
-
198. 打家劫舍(House Robber)
198. 打家劫舍(House Robber)题解动态规划复杂度分析PythonJava(待完成)题解动态规划dp[i]dp[i]dp[i]表示到第iii个房屋的偷窃最高金额。显然,递推公式为:dp[i]=max(dp[i−2]+nums[i−1],dp[i−1])dp[i]=max(dp[i-2]+nums[i-1],dp[i-1])dp[i]=max(dp[i−2]+nums[i−1]...原创 2019-12-07 19:35:59 · 136 阅读 · 0 评论 -
152. 乘积最大子序列(Maximum Product Subarray)
152. 乘积最大子序列(Maximum Product Subarray)题解动态规划复杂度分析PythonJava(待完成)题解动态规划因为有负数的存在,我们保存当前位置的最大乘积,和最小乘积,因为负数可以将最大乘积变最小,将最小变最大。初试化结果max_res=MINmax\_res=MINmax_res=MIN,当前最大乘积max_num=1max\_num=1max_num=...原创 2019-12-07 15:21:14 · 159 阅读 · 0 评论 -
581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)
581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)题解两次遍历复杂度分析PythonJava(待完成)排序比对复杂度分析PythonJava(待完成)题解两次遍历第一次简历:从前向后遍历,使用max_nummax\_nummax_num,保存到当前位置为止的最大值,若下个数大于等于max_nummax\_nummax_num,则更新m...原创 2019-11-19 15:38:43 · 145 阅读 · 0 评论 -
560. 和为K的子数组(Subarray Sum Equals K)
560. 和为K的子数组(Subarray Sum Equals K)题解哈希复杂度分析PythonJava(待完成)题解借助哈希表保存累加和sumsumsum及出现的次数。若累加和sum−ksum-ksum−k在哈希表中存在,则说明存在连续序列使得和为kkk。则之前的累加和中,sum−ksum-ksum−k出现的次数即为有多少种子序列使得累加和为sum−ksum-ksum−k。哈希初...原创 2019-11-19 12:25:52 · 130 阅读 · 0 评论 -
448. 找到所有数组中消失的数字(Find All Numbers Disappeared in an Array)
448. 找到所有数组中消失的数字(Find All Numbers Disappeared in an Array)题解鸽巢思想复杂度分析PythonJava(待完成)鸽巢思想的另一种方式复杂度分析PythonJava(待完成)题解第一时间想到一个萝卜一个坑,鸽巢思想。鸽巢思想对于题目中1<=nums[i]<=n1<=nums[i]<=n1<=nums[i]...原创 2019-11-18 17:47:29 · 156 阅读 · 0 评论 -
287. 寻找重复数(Find the Duplicate Number)
题解本题的难点在于:不能更改原数组只能使用O(1)O(1)O(1)的额外空间二分法按题目表达,设数组长度为nnn,则数组中元素∈[1,n−1]\in[1,n-1]∈[1,n−1],且只有一个重复元素。一个直观的想法,设一个数字k∈[1,n−1]k\in[1,n-1]k∈[1,n−1],统计数组中小于等于kkk的数字的个数countcountcount:若count<=kco...原创 2019-11-18 15:51:11 · 359 阅读 · 0 评论 -
238. 除自身以外数组的乘积(Product of Array Except Self)
238. 除自身以外数组的乘积(Product of Array Except Self)题解左积和右积复杂度分析PythonJava(待完成)题解使用左边乘积和右边乘积进行计算。左积和右积初始化数组长度nnn。初始化res=[0,0,...,0]res=[0,0,...,0]res=[0,0,...,0]为1∗n1*n1∗n的数组。初试化乘积k=1k=1k=1从左向右遍历,遍历...原创 2019-11-17 12:52:04 · 141 阅读 · 0 评论 -
228. 汇总区间(Summary Ranges)
228. 汇总区间(Summary Ranges)题解三指针复杂度分析PythonJava(待完成)题解三指针特判,若数组长度为1,返回str(nums[0])str(nums[0])str(nums[0])初始化左右指针l=0,r=0l=0,r=0l=0,r=0和当前访问指针cur=0cur=0cur=0。初始化结果res=[]res=[]res=[]循环条件cur<...原创 2019-11-17 00:25:54 · 181 阅读 · 0 评论 -
219. 存在重复元素II(Contains DuplicateII)
219. 存在重复元素II(Contains DuplicateII)题解哈希复杂度分析PythonJava(待完成)题解哈希初试化哈希表hash={}hash= \{\}hash={}遍历数组:若nums[i]nums[i]nums[i]不在hashhashhash中,则令nums[i]nums[i]nums[i]为key,value为当前的索引iii。若已存在:判断当...原创 2019-11-15 16:37:18 · 134 阅读 · 0 评论 -
217. 存在重复元素(Contains Duplicate)
217. 存在重复元素(Contains Duplicate)题解哈希复杂度分析PythonJava(待完成)排序复杂度分析PythonJava(待完成)题解第一时间,想到的是哈希表哈希初试化哈希表hash={}hash= \{\}hash={}遍历数组:若nums[i]nums[i]nums[i]不在hashhashhash中,则令nums[i]nums[i]nums[i]...原创 2019-11-15 16:29:01 · 203 阅读 · 0 评论 -
216. 组合总和 III(Combination Sum III)
216. 组合总和 III(Combination Sum III)题解回溯+剪枝复杂度分析PythonJava(待完成)题解回溯+剪枝初试化结果数组resresres定义回溯函数help(count,i,tmp,target)help(count,i,tmp,target)help(count,i,tmp,target),其中countcountcount表示当前已经使用的数字数...原创 2019-11-15 15:21:29 · 147 阅读 · 0 评论 -
209. 长度最小的子数组(Minimum Size Subarray Sum)
209. 长度最小的子数组(Minimum Size Subarray Sum)题解双指针+滑动窗口复杂度分析PythonJava(待完成)题解本题的最优解法是双指针。对于二分法,有兴趣的可以自己去尝试。双指针+滑动窗口初试化左指针l=0l=0l=0。最小长度res=Maxres=Maxres=Max。初始化中间和tmp=0tmp=0tmp=0遍历右指针,遍历区间[0,n)[0,...原创 2019-11-15 10:26:52 · 156 阅读 · 0 评论 -
189. 旋转数组(Rotate Array)
189. 旋转数组(Rotate Array)题解三次反转复杂度分析PythonJava(待完成)一些pythonic的解法Java(待完成)题解哈哈,这题是我考研的数据结构编程题。最反映算法本质的做法是:三次反转。当然Python的语言特性解决这道题目也有很多办法。不过建议掌握三次反转。三次反转对于[1,2,3,4,5,6,7][1,2,3,4,5,6,7][1,2,3,4,5,6,7]...原创 2019-11-15 00:26:12 · 180 阅读 · 0 评论 -
169. 求众数(Majority Element)
169. 求众数(Majority Element)题解哈希表复杂度分析PythonJava(待完成)摩尔投票法复杂度分析PythonJava(待完成)题解看到本题,我第一时间想到了哈希表,利用哈希表保存元素出现的次数。哈希表特判,若数组中只有一个元素,直接返回初试化maxcount=n//2max_count=n//2maxcount=n//2,表示若出现次数大于n//2n//2n...原创 2019-11-14 14:45:16 · 127 阅读 · 0 评论 -
167.两数之和II (Two SumII)
167.两数之和II (Two SumII)题解双指针复杂度分析PythonJava(待完成)暴力法复杂度分析PythonJava(待完成)两次哈希表复杂度分析PythonJava(待完成)一次哈希表复杂度分析PythonJava(待完成)题解和1.两数之和 leetcode 1.两数之和 CSDN不同之处在于,本题附加了有序的特殊限定。同样可以借助于暴力法在时间复杂度O(n2)O\left(...原创 2019-11-14 13:05:20 · 201 阅读 · 0 评论 -
154. 寻找旋转排序数组中的最小值II(Find Minimum in Rotated Sorted ArrayII)
154. 寻找旋转排序数组中的最小值II(Find Minimum in Rotated Sorted ArrayII)题解二分法复杂度分析PythonJava(待完成)题解旋转排序数组由两个有序子序列构成。二分法初始化左指针l=0l=0l=0,右指针r=n−1r=n-1r=n−1循环条件l<rl<rl<r:mid=(l+r)//2mid=(l+r)//2m...原创 2019-11-14 12:38:10 · 154 阅读 · 0 评论 -
81.搜索旋转排序数组II (Search in Rotated Sorted ArrayII)
81.搜索旋转排序数组II (Search in Rotated Sorted ArrayII)题解二分法算法流程:复杂度分析PythonJava(待完成)题解本题的麻烦之处二分法算法流程:特判:数组长度为0,返回-1. 数组长度为1,若nums[0]==targetnums[0]==targetnums[0]==target,返回0,否则返回-1。(这个特例无法按照算法流程计算,所以...原创 2019-11-14 11:01:30 · 211 阅读 · 0 评论 -
153. 寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array)
153. 寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array)题解二分法复杂度分析PythonJava(待完成)题解利用排序数组的特性,最小值一定是旋转点。本题和33.搜索旋转排序数组 Leetcode非常相似。33.搜索旋转排序数组 CSDN都是使用二分查找法,寻找旋转点的索引。二分法特判,若numsnumsnums为空,则返回Non...原创 2019-11-13 16:37:26 · 262 阅读 · 0 评论 -
162. 寻找峰值(Find Peak Element)
162. 寻找峰值(Find Peak Element)题解二分法复杂度分析PythonJava(待完成)题解题目中有两个重要的条件:nums[i]≠nums[i+1]nums[i] ≠ nums[i+1]nums[i]=nums[i+1]nums[−1]=nums[n]=−∞nums[-1] = nums[n] = -∞nums[−1]=nums[n]=−∞若找到一个值,右侧的下...原创 2019-11-13 15:41:04 · 244 阅读 · 0 评论 -
120. 三角形最小路径和(Triangle)
120. 三角形最小路径和(Triangle)题解动态规划复杂度分析PythonJava(待完成)题解动态规划,从上到下,保存每一层每个位置的最小路径和。动态规划特判,若triangletriangletriangle为空,返回000,若只有一层len(triangle)==1len(triangle)==1len(triangle)==1,返回元素。从第二行开始,遍历区间[1,n)[...原创 2019-11-12 20:22:49 · 206 阅读 · 0 评论 -
119. 杨辉三角II(Pascal's TriangleII)
119. 杨辉三角II(Pascal's TriangleII)题解模拟法(动态规划)复杂度分析PythonJava(待完成)题解O(k)O(k)O(k)空间复杂度,我们在118.杨辉三角基础上进行优化,仅保存上一行。模拟法(动态规划)特判,若k==0k==0k==0,返回[1][1][1]初始化dp=[1,1]dp=[1,1]dp=[1,1],表示第二行遍历区间[3,k+2)[3,...原创 2019-11-12 12:04:02 · 177 阅读 · 0 评论 -
118. 杨辉三角(Pascal's Triangle)
118. 杨辉三角(Pascal's Triangle)题解模拟法(动态规划)复杂度分析PythonJava(待完成)题解很自然的想法,模拟真实的杨辉三角填入过程。边界全为1,不为1的位置dp[i][j]=dp[i−1][j−1]+dp[i−1][j]dp[i][j]=dp[i-1][j-1]+dp[i-1][j]dp[i][j]=dp[i−1][j−1]+dp[i−1][j]模拟法(动态规...原创 2019-11-12 11:18:00 · 172 阅读 · 0 评论 -
90. 子集 II(Subsets II)
90. 子集 II(Subsets II)题解排序+回溯复杂度分析PythonJava(待完成)排序+迭代复杂度分析PythonJava(待完成)位掩码(以后再更新吧)题解为了去除重复的子集,第一时间想到排序。我们在78.子集上进行进一步的修改。可见78.子集Leetcode或78.子集CSDN排序+回溯对数组进行排序,初始化结果res=[]res=[]res=[],数组长度为nnn...原创 2019-11-11 22:02:57 · 155 阅读 · 0 评论 -
88. 合并两个有序数组(Merge Sorted Array)
88. 合并两个有序数组(Merge Sorted Array)题解合并加排序复杂度分析PythonJava(待完成)双指针,复制nums1nums1nums1复杂度分析PythonJava(待完成)双指针,从后向前复杂度分析PythonJava(待完成)题解最简单的想法,先合并两个数组再排序。合并加排序复杂度分析时间复杂度:O((m+n)log(m+n))O((m+n)log(m+n...原创 2019-11-11 20:46:35 · 216 阅读 · 0 评论 -
79. 单词搜索(Word Search)
79. 单词搜索(Word Search)题解回溯复杂度分析PythonJava(待完成)题解回溯初始化行数mmm,列数nnn,wordwordword长度lll以及访问数组visitedvisitedvisited为m∗nm*nm∗n数组,初始化为FalseFalseFalse。定义回溯函数track_back(i,j,k)track\_back(i,j,k)track_back(i,...原创 2019-11-09 21:21:48 · 335 阅读 · 0 评论 -
78.子集(Subsets)回溯+迭代+位掩码
78.子集(Subsets)回溯+迭代+位运算题解回溯复杂度分析PythonJava(待完成)迭代复杂度分析PythonJava(待完成)位掩码复杂度分析PythonJava(待完成)题解第一时间很容易想到回溯,回溯是寻找全集的很好的办法回溯初始化结果resresres和数组长度nnn定义回溯函数track_back(i,tmp)track\_back(i,tmp)track_back...原创 2019-11-09 12:45:22 · 287 阅读 · 0 评论 -
75. 颜色分类(Sort Colors)
75. 颜色分类(Sort Colors)题解三指针复杂度分析PythonJava(待完成)题解三指针定义000的右界bound_0=0bound\_0=0bound_0=0,222的左界bound_2=n−1bound\_2=n-1bound_2=n−1,nnn为数组长度。curcurcur为当前元素。当cur<=bound_2cur<=bound\_2cur<=bo...原创 2019-11-08 19:01:57 · 184 阅读 · 0 评论 -
74. 搜索二维矩阵(Search a 2D Matrix)
74. 搜索二维矩阵(Search a 2D Matrix)题解两次二分查找复杂度分析PythonJava(待完成)一次二分查找算法流程复杂度分析PythonJava(待完成)题解看到本题矩阵的性质,第一反应是使用两次二分查找。第一次查询,targettargettarget的所在行。第二次查询,targettargettarget的所在列。两次二分查找特判,若matrixmatrixm...原创 2019-11-08 11:02:03 · 247 阅读 · 0 评论 -
73. 矩阵置零(Set Matrix Zeroes)
73. 矩阵置零(Set Matrix Zeroes)题解额外空间复杂度分析PythonJava(待完成)O(1)O(1)O(1)空间算法流程复杂度分析PythonJava(待完成)题解很自然想到借助额外空间保存0的位置,然后对原矩阵进行置0额外空间定义两个元组resi,resjres_i,res_jresi,resj,保存矩阵中000的行和列索引。初始化矩阵行数mmm和列数nnn...原创 2019-11-07 20:12:52 · 267 阅读 · 0 评论 -
66. 加一(Plus One)
66. 加一(Plus One)题解一次遍历复杂度分析PythonJava(待完成)题解从后向前依次遍历,保存每次相加后除以10的商和余数,给下个数计算。一次遍历初始化加数tmp=1tmp=1tmp=1,数组长度nnn从后向前遍历,遍历区间[n-1,0]:剪枝,若加和tmp==0tmp==0tmp==0,直接退出,返回结果若首位数加上tmptmptmp等于101010,将d...原创 2019-11-07 10:57:12 · 86 阅读 · 0 评论 -
64. 最小路径和(Minimum Path Sum)
64. 最小路径和(Minimum Path Sum)题解动态规划复杂度分析PythonJava(待完成)题解固定的套路62.不同路径CSDN或LeetCode63.不同路径IICSDN或LeetCode只需改变边界上的和,剩下继续使用动态规划即可。动态规划特判:若gridgridgrid为空,返回000初始化数组行数mmm和列数nnn。初始化第一行的边界路径和,遍历区间[1,...原创 2019-11-06 20:49:16 · 120 阅读 · 0 评论 -
63. 不同路径II(Unique PathsII)
63. 不同路径II(Unique PathsII)题解动态规划复杂度分析PythonJava(待完成)题解62.不同路径CSDN或LeetCode和62不同的是,本题边界上的路径数受障碍物的影响且网格处存在障碍物,则到达此处的路径数为0。因此,只需在边界路径数上和更新路径时做些改变就可满足本题要求。动态规划特判:若obstacleGridobstacleGridobstacle...原创 2019-11-06 20:07:02 · 196 阅读 · 0 评论 -
62. 不同路径(Unique Paths)
62. 不同路径(Unique Paths)题解动态规划复杂度分析Python优化1复杂度分析优化2复杂度分析Java(待完成)题解动态规划如图所示,显然边界网格上的路径数为1,。对于网格(i,j)(i,j)(i,j)处的路径数,其中0<i<m0<i<m0<i<m,0<j<n0<j<n0<j<n。等于网格(i−1,j)...原创 2019-11-06 17:32:18 · 426 阅读 · 0 评论 -
59.螺旋矩阵II(Spiral Matrix II)
59.螺旋矩阵(Spiral Matrix)题解碰壁转向复杂度分析PythonJava(待完成)题解有了54.螺旋矩阵的基础,解决本题轻而易举。可回顾54.螺旋矩阵CSDN或者54.螺旋矩阵LeetCode碰壁转向碰到边界,就转向!显而易见,填写数字方向顺序是固定的:右,下,左,上我们利用结果数组resresres中已填写的数字和给定的矩阵的范围来构造边界定义最终结果resres...原创 2019-11-06 11:41:25 · 240 阅读 · 0 评论 -
56. 合并区间(Merge Intervals)
56. 合并区间(Merge Intervals)题解排序+一次扫描复杂度分析Python另一种写法Java(待完成)题解排序+一次扫描特判,若intervalsintervalsintervals为空,返回[][][]。定义数组长度nnn,当前合并区间[left,right][left,right][left,right],初始化:left=intervals[0][0],right=...原创 2019-11-06 10:51:27 · 227 阅读 · 0 评论 -
55. 跳跃游戏(Jump Game)
55. 跳跃游戏(Jump Game)题解贪心算法复杂度分析PythonJava(待完成)从后向前复杂度分析PythonJava(待完成)题解贪心算法定义目前达到的最远位置max_bound=0max\_bound=0max_bound=0,和上一步到达的边界end=0end=0end=0。遍历数组,遍历范围[0,n)[0,n)[0,n):所能达到的最远位置max_bound=max...原创 2019-11-05 21:45:36 · 341 阅读 · 0 评论 -
54.螺旋矩阵(Spiral Matrix)
54.螺旋矩阵(Spiral Matrix)题解规律,碰壁转向复杂度分析PythonJava(待完成)逆时针旋转(绝了)先修算法流程复杂度分析PythonJava(待完成)题解规律,碰壁转向碰到边界,就转向!显而易见,方向顺序是固定的:右,下,左,上我们利用访问数组visitedvisitedvisited和矩阵自身的范围来构造边界特判,当matrixmatrixmatrix为空时...原创 2019-11-05 19:12:52 · 593 阅读 · 0 评论 -
53. 最大子序和(Maximum Subarray)
53. 最大子序和(Maximum Subarray)题解动态规划复杂度分析PythonJava(待完成)题解动态规划定义当前最大连续子序列和cur_sum=0cur\_sum=0cur_sum=0,最大子序和res=nums[0]res=nums[0]res=nums[0],数组长度nnn对数组进行遍历,对于nums[i]nums[i]nums[i],存在两种情况:若当前最大连续子...原创 2019-11-05 16:03:49 · 106 阅读 · 0 评论 -
48. 旋转图像(Rotate Image)
48. 旋转图像(Rotate Image)题解直接旋转复杂度分析PythonJava(待完成)转置矩阵的性质复杂度分析PythonJava(待完成)题解直接旋转图像旋转,实际上是这四个位置上的数对应旋转。因此,需要找到这四个位置索引的相互关系:matrix[i][j]→matrix[j][n−i−1]→matrix[n−i−1][n−j−1]→matrix[n−j−1][i]matr...原创 2019-11-04 18:10:36 · 488 阅读 · 0 评论 -
45. 跳跃游戏 II(Jump Game II)
45. 跳跃游戏 II(Jump Game II)题解贪心算法复杂度分析PythonJava(待完成)题解使用最少的步数到达最后一个位置,则第iii步位置为第i−1i-1i−1步前的点中所能达到的最远位置。贪心算法定义步数step=0step=0step=0,能达到的最远位置max_bound=0max\_bound=0max_bound=0,和上一步到达的边界end=0end=0end...原创 2019-11-04 16:12:25 · 218 阅读 · 0 评论