数组
27.移除元素 ✅
26.删除排序数组中的重复项 ✅
283.移动零 ✅
844.比较含退格的字符串 ✅
977.有序数组的平方 ✅
209.长度最小的子数组 ✅
904.水果成篮 ✅
76. 最小覆盖子串 ✅
哈希表或数组存字符频率,优化的方案存差值
59.螺旋矩阵II ✅
按方向或层模拟,定义好变量
54.螺旋矩阵 ✅
剑指Offer 29.顺时针打印矩阵 ✅
二分查找
35. 搜索插入位置
69. x 的平方根
367. 有效的完全平方数
34. 在排序数组中查找元素的第一个和最后一个位置
81. 搜索旋转排序数组 II
细节较多,需要考虑包含重复元素的情况
153. 寻找旋转排序数组中的最小值
154. 寻找旋转排序数组中的最小值 II
540. 有序数组中的单一元素
考虑奇偶位数的情况
把问题转换为求第k (k > 1) 小的元素再求解,使用二分查找来逐步排除不可能的元素
链表
203.移除链表元素 ✅
707.设计链表 ✅
206.反转链表 ✅
92.反转链表 II ✅
24.两两交换链表中的节点 ✅
19.删除链表的倒数第N个节点 ✅
面试题 02.07. 链表相交 ✅
142.环形链表II ✅
25.K 个一组翻转链表 ✅
23.合并K个升序链表 ✅
86.分隔链表 ✅
哈希表
242.有效的字母异位词 ✅
349.两个数组的交集 ✅
202.快乐数 ✅
1.两数之和 ✅
454.四数相加II ✅
383.赎金信 ✅
8.三数之和 ✅
去重是关键
18.四数之和 ✅
字符串
344.反转字符串 ✅
541. 反转字符串II ✅
剑指Offer 05.替换空格 ✅
151.翻转字符串里的单词
剑指Offer58-II.左旋转字符串 ✅
局部反转 + 整体反转
28.实现 strStr()
459.重复的子字符串
双指针
27.移除元素 ✅
344.反转字符串 ✅
剑指Offer 05.替换空格 ✅
151.翻转字符串里的单词
206.反转链表 ✅
19.删除链表的倒数第N个节点 ✅
面试题 02.07. 链表相交 ✅
142.环形链表II ✅
8.三数之和 ✅
15.三数之和 ✅
去重是关键
18.四数之和 ✅
167.两数之和 II - 输入有序数组 ✅
88. 合并两个有序数组 ✅
76. 最小覆盖子串 ✅
滑动窗口问题编程不熟练
633.平方数之和 ✅
680.验证回文字符串 Ⅱ✅
524.通过删除字母匹配到字典里最长单词 ✅
双指针分别指到两个字符串的初始位置
340.至多包含 K 个不同字符的最长子串 ❌
栈和队列
232.用栈实现队列 ✅
225.用队列实现栈 ✅
20.有效的括号 ✅
1047.删除字符串中的所有相邻重复项 ✅
150.逆波兰表达式求值 ✅
239.滑动窗口最大值 ✅
优先队列/单调队列
347.前 K 个高频元素 ✅
注意优先队列的用法
二叉树
满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树(AVL)
144.二叉树的前序遍历 ✅
145.二叉树的后序遍历 ✅
94.二叉树的中序遍历 ✅
102.二叉树的层序遍历 ✅
226.翻转二叉树 ✅
101.对称二叉树 ✅
左右子树分别是左右中和右左中的遍历顺序
104.二叉树的最大深度 ✅
111.二叉树的最小深度 ✅
222.完全二叉树的节点个数 ❌
110.平衡二叉树 ✅
257.二叉树的所有路径 ✅
100.相同的树 ✅
404.左叶子之和 ✅
513.找树左下角的值 ✅
112.路径总和 ✅
105.从前序与中序遍历序列构造二叉树 ✅
106.从中序与后序遍历序列构造二叉树 ✅
654.最大二叉树 ✅
103.二叉树的锯齿形层序遍历 ✅
贪心
455.分发饼干 ✅
135.分发糖果 ✅
435.无重叠区间 ✅
605.种花问题 ✅
452.用最少数量的箭引爆气球 ✅
763.划分字母区间 ✅
在处理数组前,统计一遍信息(如频率、个数、第一次出现位置、最后一次出现位置等)可以使题目难度大幅降低
122.买卖股票的最佳时机 II ✅
406.根据身高重建队列 ✅
思路不太好想, 构造一个n个位置的空队列,先按照身高排序,利用高个看不到矮个的特点,依次插入到空队列中
不能有超过一个的递减区间,并且考虑一种特殊情况,比如:3 4 1 2
,虽然只有一个递减区间,但是不管是4变为1,还是1变为4,都不满足要求。所以遇到递减区间时,可以将1变为4,然后继续遍历,发现存在4 2
另一个递减区间,不满足要求。
排序
快速排序
void quick_sort(vector<int>& nums, int l, int r) {
if (l + 1 >= r) return;
int first = l, last = r - 1, key = nums[first];
while (first < last) {
while (first < last && nums[last] >= key) --last;
nums[first] = nums[last];
while (first < last && nums[first] <= key) {
++first;
}
nums[last] = nums[first];
}
nums[first] = key;
quick_sort(nums, l, first);
quick_sort(nums, first + 1, r);
}
快速选择、堆排序
桶排序、堆排序、快速排序
451. 根据字符出现频率排序
75. 颜色分类
31.下一个排列 ✅
搜索/回溯
695. 岛屿的最大面积 ✅
547. Friend Circles
417. 太平洋大西洋水流问题✅
46. 全排列 ✅
77. 组合 ✅
79. 单词搜索 ✅
51. N 皇后 ✅
130. 被围绕的区域 ✅
257. 二叉树的所有路径 ✅
47. 全排列 II ✅
37. 解数独 ✅
310. 最小高度树
需要证明最小高度的树根节点在最长路径的重点
树形DP
动态规划
509.斐波那契数 ✅
70.爬楼梯 ✅
746.使用最小花费爬楼梯 ✅
62.不同路径 ✅
63.不同路径 II ✅
198. 打家劫舍 ✅
413. 等差数列划分 ✅
64. 最小路径和 ✅
542. 01 矩阵 ✅
221. 最大正方形 ✅
dp[i] = 1 + min(dp[i-1], dp[i-4], dp[i-9])
91. 解码方法 ✅
139.单词拆分 ✅
300.最长递增子序列 ✅
674.最长连续递增序列 ✅
718.最长重复子数组 ✅
1143.最长公共子序列 ✅
1035.不相交的线
二分查找更快
1143.最长公共子序列 ✅
416.分割等和子集 ✅
474.一和零 ✅
322.零钱兑换 ✅
72.编辑距离 ✅
650.只有两个键的键盘 ✅
有点抽象
10.正则表达式匹配 ❌
509.斐波那契数 ✅
121.买卖股票的最佳时机 ✅
暴力/贪心/动态规划
122.买卖股票的最佳时机II ✅
单调栈
739.每日温度 ✅
496.下一个更大元素 I ✅
503.下一个更大元素 II ✅
42.接雨水 ✅
84.柱形图中最大的矩形 ❌
单调栈/双指针