Skip to content

Repository files navigation

Introduction:

关于LeetCode的计时,真的有点迷,还是主要看复杂度,不要过度关注计时吧。

刷题链接:

leetcode中文网:https://leetcode-cn.com/
leetcode英文网:https://leetcode.com/
Top100常见题:https://leetcode.com/problemset/top-100-liked-questions/

关于Python的详细题解记录在github,有兴趣的小伙伴可以关注下。image.png

刷题记录:

题目难度时间复杂度类型完成度方法
1.两数之和Easy$O(n)$数组、哈希表Donekey为数,value为index保存字典,判断差是否在字典中出现过
2.两数相加Medium$O(m+n)$链表No模拟加法的实现,注意进位
3.无重复字符的最长子串Medium$O(n)$字符串No字典保存字符位置,判断是否在字典中出现过
4.两个有序数组的中位数Medium$O(log(m+n))$数学No二分法,依次删除不满足条件的k/2个值
5.最长回文子串Medium$O(n^2)$字符串No从中心向两边遍历,动态规划
7.整数反转Easy$O(n)$字符串Done直接翻转
8.字符串转换整数 (atoi)Medium$O(n)$字符串Done主要是各种边界条件
9.回文数Easy$O(n)$字符串Done翻转后判断是否相等
10.正则表达式匹配Hard字符串、递归No匹配符号
11.盛最多水的容器Medium$O(n)$数组、双指针Done左右双指针谁小谁移动
13.罗马数字转整数Easy$O(n)$数学、字符串Done注意需要正负号反转的这个数
14.最长公共前缀Easy$O(mn)$字符串No水平或垂直比较
15.三数之和Medium$O(n^2)$数组、双指针、哈希表Done排序然后双指针,哈希表判断
16.最接近的三个数之和Medium$O(n^2)$双指针No同样是排序后双指针
17.电话号码的字母组合Medium$O(4^M*3^N)$数组、回溯No每次对前面的字符串组成的字母组合进行遍历
19.删除链表的倒数第N个节点Medium$O(n)$链表Done设置哑结点,快慢指针,遍历到第L-n个结点
20.有效的括号Easy$O(n)$栈、字符串Done判断新符号和栈顶元素是否可消掉
21.合并两个有序链表Easy$O(m+n)$链表Done递归不断接下一个较小结点
22.括号生成Medium$O(2^{2N}*N)$字符串、回溯No左括号数小于n,右括号数小于左括号数
23.合并K个排序链表Hard$O(kN)$链表、分置No归并;整个转换成list,排序,然后转变成链表
26.删除排序数组中的重复项Easy$O(n)$数组、双指针Done双指针,第一个遍历,第二个保存有多少个重复元素
28.实现strStr()Easy$O(n)$字符串Done滑窗遍历,KMP
29.两数相除Meidum数学Done模拟除法的原理
31.下一个排列Medium$O(n)$数组No围绕满足nums[k] < nums[k+1]的最大索引
32.最长有效括号Hard$O(n^2)$字符串No动态规划
34.在排序数组中查找元素的第一个和最后一个位置Medium$O(logn)$二分查找No通过二分查找寻找左右边界
36.有效的数独Medium$O(1)$哈希表、数组Done按照定义解决
39.组合总和Medium回溯No回溯法不断寻找,要固定一个模板
40.组合总和IIMedium回溯No后续数组,需要不断更新,去除已经选择的数
42.接雨水Hard$O(n)$数组、双指针No寻找左右两边柱子最大高度的最小值
43.字符串相乘Medium$O(mn)$字符串、数学Done转换成数字相乘、竖式
45.跳跃游戏IIHard$O(n)$贪心,DPNodp[i] = max(dp[i], dp[j]+1) for j in [0,i-1] if nums[j] >= i-j
46.全排列Medium回溯No深刻理解回溯算法
47.全排列IIMedium回溯Done和上述类似,每次添加的时候加一个判断
48.旋转图像Medium$O(n^2)$数组Done先翻转(颠倒)然后转置
49.子母异位词分组Medium$O(nk)$哈希表No将排序后字符串或统计次数作为key,相同的字符串保存对应key的list中
50.Pow(x,n)Medium$O(logn)$二分查找Done递归求解,修改函数参数而不是对函数返回值累乘
53.最大子序列和Easy$O(n)$数组、动态规划Done$f(n) = max(f(n-1)+nums[n], nums[n])$
54.螺旋矩阵Medium$O(mn)$数组No迭代m*n次,方向数组控制遍历方向,保存已经遍历过的点坐标
55.跳跃游戏Medium$O(n)$贪心、数字Done每次获取当前步所能到达的最远距离
56.合并区间Medium$O(nlogn)$排序、数组No按start排序,然后根据是否重叠拼接
59.螺旋矩阵IIMedium$O(n^2)$数组Done方向指针,主要是方向的判断,顺时针遍历
62.不同路径Meidum$O(1),O(mn)$排列组合、动态规划Done状态方程为上边和左边的状态求和
63.不同路径IIMedium$O(mn)$动态规划No有障碍物的地方dp[i][j]为0
64.最小路径和Medium$O(mn)$DPDonedp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]
66.加一Easy$O(n)$数学Done转换成字符串
69.x的平方根Easy$(logn)$二分查找No关键是边界条件
70.爬楼梯Easy$O(n)$数学Done斐波那契数列
72.编辑距离Hard$O(n^2)$DPNodp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1
74.搜索二维矩阵Medium$O(n)$数组Done从右上遍历到左下
75.颜色分类Medium$O(m)$排序Done遍历两次数组
76.最小覆盖子串Hard$O(m+n)$滑窗法No移动左右窗口边界
77.组合Medium回溯Done类似17题,套用回溯模板
78.子集Medium回溯(递归)No依然是回溯的写法吧
79.单词搜索Medium回溯,dfsNo遍历每一个点,然后将其作为字符串的起点进行dfs回溯
84.柱状图中最大的矩形Hard$O(n)$No每次用栈只保存递增序列
88.合并两个有序数组Easy$O(m+n)$归并Done归并思想,依次选择较小的元素进行拼接
90.子集IIMedium回溯Done回溯模板,判断重复,需要进行剪枝
92.反转链表IIMedium$O(n)$链表No首先结点移动到反转起始位置,然后反转链表,直到反转的截止处
94.二叉树的中序遍历Medium$O(n)$树、DFSDone递归遍历,依次左根右
96.不同的二叉搜索树Medium$O(n)$二叉树、DP,数学No$C_0 = 1,C_{n+1} = \frac{2(2n+1)}{n+2}C_n$
98.验证二叉搜索树Medium$O(n)$树、DFSNo中序遍历,判断是否满足递增序列
100.相同的树Easy$O(n)$树、递归Done递归遍历判断每一个结点是否相同
101.对称二叉树Easy$O(n)$二叉树No递归判断左右子树是否相等
102.二叉树的层次遍历Medium$O(n)$二叉树、队列、BFSDone分层遍历,循环遍历当前层的所有结点
103.二叉树的锯齿形层次遍历Medium$O(n)$DFS、二叉树、队列Done相比上一题增加一个奇偶的判断
104.二叉树的最大深度Easy$O(n)$二叉树、递归Done递归遍历结点,求左右子树的深度
105.从前序与中序遍历序列构造二叉树Medium$O(n)$二叉树、递归,DFSDone先获取根结点,然后对左右子树递归调用
106.从中序与后序遍历序列构造二叉树Medium$O(n)$二叉树、递归,DFSDone同上,主要是中序遍历和后序遍历的识别
108.将有序数组转换为二叉搜索树Medium$O(n)$二叉树、递归Done先得到根节点,然后左右子树遍历生成
110.平衡二叉树Easy$O(n^2)$二叉树、递归,DFSNo判断每个结点左右子树的深度差是否小于1
111.二叉树的最小深度Easy$O(n)$二叉树、迭代、BFSDone类似分层遍历,左右子树均不存在时返回树深
112.路径总和Easy$O(n)$二叉树、迭代、递归No遍历每一个结点,然后到叶节点判断sum
113.路径总和IIMedium$O(n)$二叉树、迭代、递归、树的遍历No主要是递归和迭代的套路是啥
114.二叉树展开为链表Meidum$O(n)$二叉树、链表、DFSNo关键是如何原地修改
118.杨辉三角Easy$O(n^2)$数组Done根据上一层构建下一层,找到关系式即可
121.买卖股票的最佳时机Easy$O(n)$数组Done两个变量,到目前为止的最小价格和最大利润
122.买卖股票的最佳时机IIEasy$O(n)$数组、贪心Done不断添加波谷波峰
123.买卖股票的最佳时机IIIMedium$O(n)$动态规划No两次交易,分开简历状态转移方程
124.二叉树的最大路径和Hard$O(n)$DFSNo求每个结点作为根节点到叶节点的的最大路径和,不停更新全局变量
128.最长连续序列Hard$O(n)$哈希表No将nums保存成set,如果num-1不在set中启动遍历
131.分割回文串Medium回溯No回溯法,s为空则保存,否则继续遍历,遍历所有头回文串
136.只出现一次的数字Easy$O(n)$数组、哈希表、位运算Done统计次数、数学公式、异或
137.只出现一次的数字IIEasy$O(n)$数组、哈希表、位运算Done很迷,此处位运算麻烦些
139.单词拆分Medium$O(n^2)$DPDonedp[i] = if dp[j] and s[j:i] in wordDict for j in range(0,i)
141.环形链表Easy$O(n)$链表、双指针Done快慢指针或者设置特殊值然后判断
142.环形链表IIMedium$O(n)$链表,双指针,哈希表Done哈希表保存已知结点位置,判断新节点是否在哈希表中
144.二叉树的前序遍历Easy$O(n)$二叉树、DFSDone递归遍历,根左右结点
145.二叉树的后序遍历Medium$O(n)$二叉树、DFSDone递归遍历,左右跟结点
146.LRU缓存机制Medium$O(1)$哈希表No使用有序字典来实现
148.排序链表Medium$O(nlogn)$链表、排序Done先放在一个数组里面排序,然后重新生成链表
151.翻转字符串里的单词Medium$O(n)$字符串Donesplit,拆分,倒序,拼接
152.乘积最大子序列Medium$O(n^3)$数组No$fmax(i) = max(fmax(i-1)*num[i], fmin(i-1)*num[i], num[i]),fmin(i) = min(fmax(i-1)*num[i], min(i-1)*num[i], num[i])$
153.寻找旋转排序数组中的最小值Medium$O(logn)$数组,二分查找Nomid和right比较,截止条件是left<right
154.寻找旋转排序数组中的最小值 IIHard$O(logn)$数组、二分查找Done和上述类似,只需考虑重复值
155.最小栈Easy$O(1)$Done建立辅助栈,push的时候和最小栈的栈顶元素比,决定哪个元素入栈
160.相交链表Easy$O(m+n)$链表Done长链表先走,然后再一起走
167.两数之和 II-输入有序数组Easy$O(n)$数组、双指针、二分查找Done双指针,前后遍历
169.求众数Easy$O(n)$数组、哈希表Done哈希表(统计次数),排序返回中间元素
171.Excel表列序号Easy$O(n)$数学Done模拟进制转换
172.阶乘后的零Easy$O(logn)$数学No求每一部分因子为5的个数
179.最大数Medium数组、排序No关键是排序规则书写,熟悉key和cmp_to_key
189.旋转数组Easy$O(1)$数组Done注意原地操作
190.点到二进制位Easy$O(n)$位运算Done转换成二进制,zfill0填充,字符串翻转
191.位1的个数Easy$O(n)$位运算Done转换成二进制,统计1的个数即可
198.打家劫舍Easy$O(n)$动态规划No$f(n) = max(f(n-1), f(n-2)+nums[n])$
200.岛屿数量Medium$O(mn)$dfsNo遍历每一个点,令1周围的1都变成0
201.数字范围按位与Easy$O(n)$位运算No发现二进制的规律
202.快乐数Easy哈希表、数组No1-4之间只有1是快乐数,>4的非快乐数都会进入4或者3的循环序列
204.计算质数Easy$O(n)$哈希表、数学No设置质数数组,然后让质数的倍数为False
206.反转链表Easy$O(n)$链表No修改原链表的结点指向,然后赋值给目标结点
207.课程表Medium$O(E+V)$No拓扑排序
208.前缀树Medium$O(n)$二叉树No字典实现这种数据结构
215.数组中的第K个最大的元素Medium$O(n)$数组、堆Done利用最小堆实现
216.组合总和IIIMedium$O(n)$回溯Done回溯,加一个判断,判断长度
217.存在重复元素Easy$O(n)$哈希表Done哈希表判断
219.存在重复元素IIEasy$O(n)哈希表Done哈希表保存每个数出现的位置,增加一个条件判断索引
220.存在重复元素IIIMedium$O(n)$桶排序No复杂度达不到要求
221.最大正方形Medium$O(mn)$DPNodp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]) + 1
225.用队列实现栈EasyO(n)队列、栈No将队列前面的元素依次出队,然后放在新元素的后面
226.翻转二叉树Easy$O(n)$二叉树、递归Done交换左右子树,然后对左右子树递归
229.求众数IIMedium$O(n)$数组、排序、哈希表Done哈希表统计次数
230.二叉搜索树中第k小的元素Medium$O(n)$二叉树、dfsDone中序遍历,得到排序数组
231.2的幂Easy$log(n)$数学Done依次除以2,直到不能整除,判断最后是否是1;二进制1的个数
232.用栈实现队列EasyO(n)栈、队列Done建立一个辅助栈,stack2为空后将stack1的放进去
234.回文链表Easy$O(n)$链表、指针Done转成数组然后判断是否是回文数组
235.二叉搜索树的最低公共祖先Easy$O(n)$二叉树、dfsNo寻找最低的大于左结点小于右节点的结点值
236.二叉树的最低公共祖先Medium$O(n)$二叉树,dfsNo求以node为根结点的子树是否出现过两个结点
237.删除链表中的结点Easy$O(1)$链表Done鬼题目,只需分别对val和next赋值
238.除自身以外数组的乘积Medium$O(n)$数组Done左右分别累乘,注意边界值
239.滑动窗口最大值Hard$O(kn)$数组、堆、队列Done最优解不会
240.搜索二维矩阵IIMedium$O(m+n)$数组、二分查找Done从左上遍历到右下
242.有效的字母异位词Easy$O(n)$哈希表DoneCounter统计每个字符的次数
260.只出现一次的数字IIIMedium$O(n)$数组、哈希表Done我佛
263.丑数IEasy数学Donewhile不停判断是否有2,3,5因子,是否为1
264.丑数IIMedium$O(1)$数组、DPNodp[i] = min(2*dp[p2],3*dp[p3],5*dp[p5])
268.缺失数字Easy$O(n)$数学Done公式求解
279.完全平方数Medium$O(n)$数学、DPNo动态规划超时,数学方法最优
283.移动零Easy$O(n)$数组、双指针Done移除0,然后append0
287.寻找重复数Medium$O(n),O(nlogn)$二分法、链表No同时满足多个条件比较麻烦
289.生命游戏Medium$O(mn)$数组Done按照题意遍历既可以,每次判断
292.Nim游戏Easy$O(1)$数学Done如果是4的倍数肯定会输
295.数据流中的中位数Hard$O(n)$最小堆,二分No二分插入排序,优先队列,双堆
300.最长上升子序列Medium$O(logn)$数组、贪心、DPNo依次添加比较小的数在辅助序列里面
309.最佳买卖股票时机含冷冻期Medium$O(n)$动态规划No状态转移方程
312.戳气球Hard$O(n^3)$DPNodp[i][j] = max(nums[i]*nums[k] *nums[j]+dp[i][k]+dp[k][j])
315.计算右侧小于当前元素的个数Medium$O(n)$数组No。。。
322.零钱兑换Medium$O(Sn)$动态规划Nodp[i] = min(dp[i], dp[i-coin]+1) for coin in coins
326.3的幂Easy$O(log(n))$数学Done循环遍历
328.奇偶链表Medium$O(n)$链表No奇偶位置,分开保存在两个链表中
334.递增的三元子序列Medium$O(n)$数组Done三元组判断
337.打家劫舍IIIMedium动态规划、二叉树No一个二元数组代表是否包含根节点
338.比特位计数Medium$O(32n)$二进制Done和191类似,无差别
343.整数拆分Medium$O(1)$数组、DPNo找规律
344.反转字符串Easy$O(n)$字符串Done原地翻转
347.前 K 个高频元素Medium$O(n)$堆、哈希表No和215类似,但需要注意更多的地方
350.两个数组的交集IIEasy$O(m,n)$数组、哈希表DoneCounter转成字典判断,排序后比较
371.两整数之和Easy$O(n)$位运算No异或代表求和,与代表进位,二进制来求解
384.打乱数组Medium$O(n)$数组Done做拷贝,利用random.shuffle打乱
387.字符串中的第一个唯一字符Easy$O(n)$哈希表Done直接统计次数即可
392.判断子序列Easy$O(n)$队列Done判断目标字符串,如果能匹配,则删除第一个字符
394.字符串解码Medium$O(n)$No‘[’:括号外的字符串和出现次数入栈,']':括号内的字符串出栈
395.至少有k个重复字符的最长子串Medium递归、分治No对原始字符串进行拆解,然后递归调用
399.除法求值Medium$O(n)$图、DFSNo转换成图,然后利用图结构求解
401.二进制手表Easy$O(1)$数位运算No遍历所有的时间组合,然后求1的个数
406.根据身高重建队列Medium$O(nlogn)$数组、排序No对身高降序排序,人数升序排序
410.分割数组的最大值Hard$O(nlog(sum/k))$二分查找、贪心No遍历值,判断和是否存在
412.Fizz BuzzEasy$O(n)$数学Done直接遍历
416.分割等和子集Medium$O(ns)$DPNodp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i]],(nums[i] <= j)
414.第三大的数Easy$O(n)$数组、堆Done和215类似,同时可以用规则
437.路径总和IIIEasy$O(n)$树、栈、递归No对题意的理解以及对树深度遍历的把控
438.找到字符串中所有字母异位词Easy$O(n)$哈希表、滑窗法No滑窗法,不断移动左右边界来判断
448.找到所有数组中消失的数字Easy$O(n)$数组、哈希表Done遍历,然后判断,按索引求反
461.汉明距离Easy$O(n)$位运算Done做异或,然后统计1的个数
477.汉明距离总和Medium$O(36*n)$位运算No不可两两异或,求每一位1的个数和0的个数,然后相乘求和
494.目标和Medium$O(n^2)$背包问题No不懂,不会
496.下一个更大的元素IEasy$O(n)$栈、哈希表Done类似739题,都是相似的
503.下一个更大的元素IIMedium$O(n)$Done和496类似,对nums做一个复制
509.斐波那契数列Easy$O(n)$DPDoneDP展开
523.连续的子数组和Medium$O(n^2)$数组Done和560相似,求子数组和即可
538.把二叉搜索树转换为累加树Medium二叉树、递归No反向中序遍历,先右子树,然后根节点累加,然后左子树
543.二叉树的直径Easy$O(n)$二叉树、DFSNo和求树的深度一样,路径为L+R+1
557.翻转字符串中的单词IIIEasy$O(n)$字符串Done空格划分,然后单词内翻转
559.N叉树的最大深度Easy$O(n)$二叉树Done类似普通二叉树的遍历,注意max的list不能为空
560.和为K的子数组Medium$O(n)$哈希表、数组No保存累积求和出现的次数
581.最短无序连续子数组Easy$O(nlogn)$数组、排序、栈Done先排序,然后比较不同元素的索引
617.合并二叉树Easy$O(n)$二叉树、递归Done对每个子节点递归,判断根节点是否为空
647.回文子串Medium$O(n^2)$字符串Done中心扩散
654.最大二叉树Medium二叉树、递归Done对整个数组和左右边数组依次递归调用
668.乘法表中的第k小的数Hard$O(mlog(mn))$二分查找No太难了不会
704.二分查找Easy$O(logn)$二分查找Done直接上模板
714.买卖股票的最佳时机含手续费Medium$O(n)$数组、动态规划Done和122类似,弄懂122
739.每日温度Medium$O(n)$No根据温度大小关系,不断将其入栈
746.使用最小花费爬楼梯Easy$O(n)$DPDonedp[i] = min(dp[i-1],dp[i-2]) + cost[i]
876.链表的中间结点Easy$O(n)$链表,双指针Done快慢指针
1047.删除字符串中的所有相邻重复项Medium$O(n)$栈、字符串Done新元素和栈顶元素比较
1103.分糖果IIEasy$O(max(G,N))$数组Done依次添加新元素

About

Python刷Leetcode

Topics

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages