链表:
160. Intersection of Two Linked Lists
https://leetcode.com/problems/intersection-of-two-linked-lists/
找链表交点,走到头就从另一个的头开始走
146. LRU Cache
https://leetcode.com/problems/lru-cache/--+9
https://www.acwing.com/activity/content/code/content/2763800/
460. LFU Cache
https://leetcode.com/problems/lfu-cache/
双链表加双链表,每个双链表的节点上再存一个双链表
merge K sorted List 第一种做法堆,第二种 分治
- 翻转双向链表,
cur = head
while (cur != null)
1.先找到当前节点的前一个结点 temp = cur.pre
2.当前节点的next变成当前节点的pre节点 cur.pre = cur.next
3.temp变成当前节点的next节点 cur.next = temp
4.当前节点变成当前节点的pre cur = cur.pre
树:
LCA问题
1650: https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree-iii/
可以转化为链表相交问题,两个都往上走,一个到达root了,就把这个点放到另一个点,然后再往上走,他们俩一定会再LCA相遇
987. Vertical Order Traversal of a Binary Tree
https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/
根据treeMap的key 设为col 排序,然后再根据value的 int[] 对应的row先排序,row一样,根据value排序
树建图,如果是一个方向,就建成从parent到child的map 邻接表就好了,如果是双向的,就要再建一个child到parent的
- All Ancestors of a Node in a Directed Acyclic Graph
https://leetcode.com/problems/all-ancestors-of-a-node-in-a-directed-acyclic-graph/
建图,从下到上的遍历
BST
中序遍历是有序的
https://leetcode.com/problems/kth-smallest-element-in-a-bst/submissions/
230. Kth Smallest Element in a BST
优化到O(k)https://www.acwing.com/activity/content/code/content/2832131/
对于前序遍历,中序遍历,后续遍历,不需要考虑那么多细节,只需要记着第一次做计算的地方,就是根据你的遍历顺序的那个起点开始的计算,并不需要考虑递归的细节
dfs(root.left)
xxxx
dfs(root.right)
并不需要考虑 dfs(root.left)dfs(root.right)第一次这两个干了什么,就考虑第一次的点就是相应的遍历顺序能得到的点,这个点做的xxxx操作
树的题在做递归的时候,要确保一个条件, 每个节点都做了相关的计算,而且要保证这个节点做的计算是正确的
如果不能保证每个节点都做了相关的计算或者不能保证每个节点都做了相关正确的计算,这个时候一般就要加参数
哈希表
2013. Detect Squares https://leetcode.com/problems/detect-squares/
用两个哈希表分别存 x -> (y, 这个点出现的次数), 同一个x可能会对应很多y, 同一个y又可能出现很多次.
这个题需要精确到每个点出现的数量
递推
1284. Minimum Number of Flips to Convert Binary Matrix to Zero Matrix
https://leetcode.com/problems/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix/
等同于提高班 费解的开关
双指针
都是可以固定住后面的指针,证明出前面的指针只能往后走,不可能往前走,找到前面的j指针往前走的条件。
最长不连续子序列
1477. Find Two Non-overlapping Sub-arrays Each With Target Sum
https://leetcode.com/problems/find-two-non-overlapping-sub-arrays-each-with-target-sum/
https://www.acwing.com/file_system/file/content/whole/index/content/4123169/
DFS
leetcode 329 记忆化搜索
https://www.acwing.com/solution/content/68381/
-
Serialize and Deserialize Binary Tree
https://leetcode.com/problems/serialize-and-deserialize-binary-tree/
二叉树的序列化,采用前序遍历 用逗号分隔,保证数不乱,空节点加”#”, 反序列化,全局变量指针 指向”#” 返回null
这里一定要记得 String匹配,要使用equals不要使用== -
Time Needed to Inform All Employees
https://leetcode.com/problems/time-needed-to-inform-all-employees/
使用map建图, -
Robot Room Cleaner
https://leetcode.com/problems/robot-room-cleaner/
搜索,不能用BFS,因为BFS无法回溯到原点。
DP
线性DP,多数是字符串问题
902. 最短编辑距离
https://www.acwing.com/problem/content/904/
数学推理
2128. Remove All Ones With Row and Column Flips
https://leetcode.com/problems/remove-all-ones-with-row-and-column-flips/
对于每两行来说,只有当这两行要么完全一样,要么完全相反,只有这样才能够最终得到全是0的结果,所以就枚举每一行取和第一行比较,如果第一个数字相反,那么都要相反,如果第一个数字相同,那么都要相同,做异或判断是否相同,不进位加法
并查集
2092. Find All People With Secret
https://leetcode.com/problems/find-all-people-with-secret/
并查集的find操作,包括了路径压缩, 凡是find的节点,就将路径上所有的点的父节点指向了真正的root节点
merge 暂时只是改变了root节点指向了另一个集合的root节点,但是当重新find一遍的时候,进行了路径压缩,又都指向了真正的root节点