说明
http://blog.wangcaimeng.top/2019/04/05/Leetcode刷题简短总结/
一句话简短的总结,用于自己复习回顾,详细解法非常推荐 https://github.com/MisterBooo/LeetCodeAnimation
1.两数之和 简单
HashSet, 一次遍历 O(n)
2.两数相加 中等
数字由链表从低位到高位表示,按位做加法进位即可
3.无重复的最长子串 中等
滑动窗口+HashSet
5.最长回文串 中等
暴力法O(n^3) 反转+最长公共子串 DP 中心扩展O(n^2) Manacher 算法O(n)
6.Z字形变换 中等
分析规律,当前行变量,方向变量
7.整数反转 简单
计算前判断溢出
8.字符串转换整数 (atoi) 中等
判断溢出,合法性判断
9.回文数 简单
负数返回False 正数反转一般数字,用//10的方法
15.三数之和 中等
转化为两数之和
20.有效的括号 简单
stack
26.删除排序数组中的重复项 简单
要求原地算法,双指针,和partition类似
27.移除元素 简单
同26
28.实现strStr() 简单
字符串查找算法 暴力法或KMP(难)
33.搜索旋转排序数组 中等
先二分,再有序的一变二分查找,找不到继续二分另一半,此题无重复元素,若有,参考剑指offer,二分后不知道哪侧有序是需要顺序查找。
35.搜索插入位置 简单
有序数组, 最优为二分查找
42.接雨水 困难
DP从左遍历求每个位置左侧最高,从右遍历求每个位置右侧最高,最后遍历求结果
69.x的平方根 简单
题目要求返回整数,牛顿迭代法计算到结果的平方小于x
71.简化路径 中等
用/分割
80.删除排序数组中的重复项 II 中等
partition+变量计数
93.复原IP地址 中等
递归dfs
94.二叉树中序遍历 中等
非递归 记住
def inorderTraversal(self, root):
result = []
stack = []
while root or stack:
while root:
stack.append(root)
root = root.left
root = stack.pop()
result.append(root.val)
root = root.right
return result
100.相同的树 中等
递归,如果当前节点不为空且节点值相同,比较其左右子数
101.对称二叉树 简单
递归判断,两个根结点具有相同的值且每个树的右子树都与另一个树的左子树镜像对称。 或用队列
102.二叉树的层次遍历 简单
队列 逐层遍历
104.二叉树的最大深度 简单
递归dfs 非递归遍历,栈中记录当前节点深度
108.将有序数组转换为二叉搜索树 简单
二分、递归 非递归 栈里存(node,l,r) 和前序遍历类似,现构建做节点,赋值,再构建右节点
110.平衡二叉树 简单
自顶向下 递归判断左右子树深度 O(n^2)
自底向上 dfs 左右差>1返回-1 O(n)
111.二叉树的最小深度 简单
注意[1,2]最小深度是0
120.三角形最小路径和 中等
DP
122.买卖股票的最佳时机 II 简单
贪心法,出现价格差即买入卖出
144.二叉树的前序遍历 中等
非递归
def preorderTraversal(self, root):
if root == None:
return []
stack = [root]
result = []
while stack:
cur = stack.pop()
if cur != None:
result.append(root.val)
if cur.right != None:
stack.append(root.right)
if cur.left != None:
stack.append(root.left)
return result
146.LRU缓存机制 困难
使用LinkedHashMap python使用链表和字典,dict[key]存key的节点的前一个节点 保持链表的顺序
152. 乘积最大子序列 中等
注意负数,一次遍历更新最大值和最小值
155.最小栈 简单
使用两个栈 min栈栈顶为最小元素
169.求众数 简单
转化为Top-k问题 求第(n-1)/2小的元素
189.旋转数组 简单
reverse整个数组,reverse前k个,reverse k到n-1个
202.快乐数 简单
用一个hashSet记录出现过的数,若再次出现说明出现循环 返回False
215.数组中的第K个最大元素 中等
循环 partition
218.天际线问题 困难
221.最大正方形 中等
dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1 #以i,j为右下角的最大正方形变长
230.二叉搜索树中第K小的元素 中等
中序遍历
236.二叉树的最近公共祖先 中等
递归遍历当前节点及左右 若当前节点及左右子树包含目标节点,更新结果,遍历完整棵树的结果即为最深的公共祖先
238.除自身以外数组的乘积 中等
先从左遍历结果为[1,a[0],a[0]*a[1]…a[0]*a[n-2]],再从右遍历即可得到结果
240.搜索二维矩阵 II 中等
分析规律
283.移动零 简单
partition
297.二叉树的序列化与反序列化 中等
中序遍历及恢复,队列实现
334.递增的三元子序列 中等
一次遍历,记录第一小和第二小的元素,找到第三小返回True
354.俄罗斯套娃信封问题 困难
先按宽度排序,宽度相同按高度排序。然后从小到大遍历信封,在结果集合中二分查找并插入信封。
371.两整数之和 简单
不用±实现加法,a^b 无进位加法 (a&b)<<1 进位 python实现注意判断32位溢出,因为python不会溢出
384.打乱数组 中等
随机洗牌算法,遍历一遍,每次从当前元素前边的元素中随机选择一个与当前元素交换
547.朋友圈 中等
dfs遍历每个区域 set记录访问过点
567. 字符串的排列 中等
dict或数组实现 统计次数 次数匹配即可
695. 岛屿的最大面积 中等
dfs 和547类似 不过要记录面积 并更新最大值 不需要记录又几个区域