队列
https://www.bilibili.com/read/cv6366407/
链表
https://blog.csdn.net/qq_42363032/article/details/103761412
树
https://www.cnblogs.com/sunshineliulu/p/7775063.html
堆
https://www.jianshu.com/p/6b526aa481b1
做算法题的时候,我们一般都按照leetcode中的标签来分类,但这样分类并不是很好,用题的解法来分类,能让我们更快的掌握常见算法题的解决思路。
滑动窗口可以看成数组中框起来的一个部分。在一些数组类题目中,我们可以用滑动窗口来观察可能的候选结果。当滑动窗口从数组的左边滑到了右边,我们就可以从所有的候选结果中找到最优的结果。滑动窗口一般表示成一个左闭右开区间,窗口的左边界和右边界永远只能向右移动,而不能向左移动。这是为了保证滑动窗口的时间复杂度是 O(n)O(n)。如果左右边界向左移动的话,这叫做“回溯”,算法的时间复杂度就可能不止 O(n)。
3. 无重复字符的最长子串
209. 长度最小的子数组
239. 滑动窗口最大值
剑指 Offer 57 - II. 和为s的连续正数序列
双指针通常用在排好序的数组或是链表中寻找对子, 或者是merge 或者是排序,或者去除element,反正一般都是头尾各一个指针,然后根据条件移动。
167. 两数之和 II - 输入有序数组
977. 有序数组的平方
283. 移动零
27. 移除元素
26. Remove Duplicates from Sorted Array
16. 3Sum Closest
18. 4Sum
86. Partition List
11. Container With Most Water
42. Trapping Rain Water
75. Sort Colors
剑指 Offer 04. 二维数组中的查找
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
快慢指针是处理linked list常用的套路,通常是用来判断成环以及环的入口,或者是寻找 list中第k个元素。
141. 环形链表
142. 环形链表 II
234. 回文链表
61. 旋转链表
剑指 Offer 18. 删除链表的节点
JZ56 删除链表中重复的结点
剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 35. 复杂链表的复制
剑指 Offer 52. 两个链表的第一个公共节点
234. 回文链表
206. 反转链表
25. K 个一组翻转链表
92. 反转链表 II
区间合并的问题,通常是重新把区间按照start和end排序,重新组合区间。
56. 合并区间
986. 区间列表的交集
57. 插入区间
要求 inplace, 通常是采用正负反转的做法
41. 缺失的第一个正数
448. 找到所有数组中消失的数字
剑指 Offer 03. 数组中重复的数字
BFS通常用来处理层序遍历和最短路径,采用queue 来实现
102. 二叉树的层序遍历
103. 二叉树的锯齿形层序遍历
297. Serialize and Deserialize Binary Tree
127. 单词接龙
207. 课程表 【拓扑排序】
通常采用递归 111. Minimum Depth of Binary Tree
112. Path Sum
113. Path Sum II(和剑指 Offer 34. 二叉树中和为某一值的路径一样)
437. Path Sum III
100. Same Tree
101. Symmetric Tree
104. Maximum Depth of Binary Tree
110. Balanced Binary Tree
剑指 Offer 26. 树的子结构
剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 54. 二叉搜索树的第k大节点(inorder)
对于排列和组合的题目,需要主要判断是否会有重复数字,如有重复,需要先进行sort,而且需要进行剪枝。
78. 子集
90. Subsets II
46. Permutations
47. Permutations II
39. Combination Sum
(区别 322. Coin Change
518. Coin Change 2)
40. Combination Sum II
131. Palindrome Partitioning !
17. Letter Combinations of a Phone Number (differ from 91. Decode Ways)
79. Word Search(same as 剑指 Offer 12. 矩阵中的路径)
剑指 Offer 13. 机器人的运动范围
通常是查找中位数,构建一个最小堆和最大堆。 以及查找数据流中最小的或者最大的数。
295. 数据流的中位数
480. 滑动窗口中位数
34. 在排序数组中查找元素的第一个和最后一个位置
33. 搜索旋转排序数组
153. 寻找旋转排序数组中的最小值
154. 寻找旋转排序数组中的最小值 II
162. 寻找峰值
540. 有序数组中的单一元素
剑指 Offer 16. 数值的整数次方
采用priority queue 或者 说在python 中的heapq 求top k 采用最小堆(默认) 采用最大堆的时候可以采用push 负的value
215. Kth Largest Element in an Array
347. Top K Frequent Elements
373. Find K Pairs with Smallest Sums
K路归并能帮咱们解决那些涉及到多组排好序的数组的问题。
每当你的输入是K个排好序的数组,你就可以用堆来高效顺序遍历其中所有数组的所有元素。你可以将每个数组中最小的一个元素加入到最小堆中,从而得到全局最小值。当我们拿到这个全局最小值之后,再从该元素所在的数组里取出其后面紧挨着的元素,加入堆。如此往复直到处理完所有的元素。
特殊情况:2路并归 (mergesort 中的merge, 双指针就可以完成)
23. Merge k Sorted Lists
21. Merge Two Sorted Lists
参考:https://zhuanlan.zhihu.com/p/91582909 参考:https://zhuanlan.zhihu.com/p/126546914
300. Longest Increasing Subsequence
1143. Longest Common Subsequence
72. Edit Distance
44. Wildcard Matching
10. Regular Expression Matching
120. Triangle
53. Maximum Subarray
152. Maximum Product Subarray
887. Super Egg Dropref
198. House Robber
213. House Robber II (两个dp)
121. Best Time to Buy and Sell Stock
122. Best Time to Buy and Sell Stock II
188. Best Time to Buy and Sell Stock IV
123. Best Time to Buy and Sell Stock III ref
714. Best Time to Buy and Sell Stock with Transaction Fee
309. Best Time to Buy and Sell Stock with Cooldown
516. Longest Palindromic Subsequence !
5. Longest Palindromic Substring
416. Partition Equal Subset Sum
322. Coin Change
518. Coin Change 2
91. Decode Ways
139. Word Break
剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- II. 青蛙跳台阶问题
矩形覆盖
变态跳台阶
剑指 Offer 14- I. 剪绳子
剑指 Offer 46. 把数字翻译成字符串
剑指 Offer 47. 礼物的最大价值
剑指 Offer 49. 丑数
剑指 Offer 60. n个骰子的点数
Selection Sort
Heapsort
Mergesort
Insertion Sort
Shell's Sort
Quicksort
Bubblesort
Linear Sorting
剑指 Offer 36. 二叉搜索树与双向链表
109. Convert Sorted List to Binary Search Tree
114. Flatten Binary Tree to Linked List
105. Construct Binary Tree from Preorder and Inorder Traversal
106. Construct Binary Tree from Inorder and Postorder Traversal
606. Construct String from Binary Tree
1008. Construct Binary Search Tree from Preorder Traversal
889. Construct Binary Tree from Preorder and Postorder Traversal
136. Single Number
540. Single Element in a Sorted Array
190. Reverse Bits
剑指 Offer 15. 二进制中1的个数
剑指 Offer 56 - I. 数组中数字出现的次数
剑指 Offer 56 - II. 数组中数字出现的次数 II
一般都有很多corner cases 需要考虑
8. String to Integer (atoi)
剑指 Offer 20. 表示数值的字符串
剑指 Offer 58 - I. 翻转单词顺序(2次翻转)
剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 31. 栈的压入、弹出序列
155. 最小栈
剑指 Offer 09. 用两个栈实现队列
172. Factorial Trailing Zeroes
470. Implement Rand10() Using Rand7()
剑指 Offer 66. 构建乘积数组
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
剑指 Offer 68 - II. 二叉树的最近公共祖先
二叉树的下一个结点