http://blog.wangcaimeng.top/2019/04/05/Leetcode刷题简短总结/
一句话简短的总结,用于自己复习回顾,详细解法非常推荐 https://github.com/MisterBooo/LeetCodeAnimation
HashSet, 一次遍历 O(n)
数字由链表从低位到高位表示,按位做加法进位即可
滑动窗口+HashSet
暴力法O(n^3) 反转+最长公共子串 DP 中心扩展O(n^2) Manacher 算法O(n)
分析规律,当前行变量,方向变量
计算前判断溢出
判断溢出,合法性判断
负数返回False 正数反转一般数字,用//10的方法
转化为两数之和
stack
要求原地算法,双指针,和partition类似
同26
字符串查找算法 暴力法或KMP(难)
先二分,再有序的一变二分查找,找不到继续二分另一半,此题无重复元素,若有,参考剑指offer,二分后不知道哪侧有序是需要顺序查找。
有序数组, 最优为二分查找
DP从左遍历求每个位置左侧最高,从右遍历求每个位置右侧最高,最后遍历求结果
题目要求返回整数,牛顿迭代法计算到结果的平方小于x
用/分割
partition+变量计数
递归dfs
非递归 记住
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
递归,如果当前节点不为空且节点值相同,比较其左右子数
递归判断,两个根结点具有相同的值且每个树的右子树都与另一个树的左子树镜像对称。 或用队列
队列 逐层遍历
递归dfs 非递归遍历,栈中记录当前节点深度
二分、递归 非递归 栈里存(node,l,r) 和前序遍历类似,现构建做节点,赋值,再构建右节点
自顶向下 递归判断左右子树深度 O(n^2)
自底向上 dfs 左右差>1返回-1 O(n)
注意[1,2]最小深度是0
DP
贪心法,出现价格差即买入卖出
非递归
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
使用LinkedHashMap python使用链表和字典,dict[key]存key的节点的前一个节点 保持链表的顺序
注意负数,一次遍历更新最大值和最小值
使用两个栈 min栈栈顶为最小元素
转化为Top-k问题 求第(n-1)/2小的元素
reverse整个数组,reverse前k个,reverse k到n-1个
用一个hashSet记录出现过的数,若再次出现说明出现循环 返回False
循环 partition
dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1 #以i,j为右下角的最大正方形变长
中序遍历
递归遍历当前节点及左右 若当前节点及左右子树包含目标节点,更新结果,遍历完整棵树的结果即为最深的公共祖先
先从左遍历结果为[1,a[0],a[0]*a[1]…a[0]*a[n-2]],再从右遍历即可得到结果
分析规律
partition
中序遍历及恢复,队列实现
一次遍历,记录第一小和第二小的元素,找到第三小返回True
先按宽度排序,宽度相同按高度排序。然后从小到大遍历信封,在结果集合中二分查找并插入信封。
不用±实现加法,a^b 无进位加法 (a&b)<<1 进位 python实现注意判断32位溢出,因为python不会溢出
随机洗牌算法,遍历一遍,每次从当前元素前边的元素中随机选择一个与当前元素交换
dfs遍历每个区域 set记录访问过点
dict或数组实现 统计次数 次数匹配即可
dfs 和547类似 不过要记录面积 并更新最大值 不需要记录又几个区域