- 自己能在面试中A4纸写出来的代码才是好代码,不要一味追求复杂度低的代码,如果写都写不出来更不用谈复杂度。
- 第一遍先大概粗过一遍题目思路,第二遍再刷代码。
- 标注出不熟悉的题目,隔天复习,加强记忆。
数组
数学
字符串
链表
二叉树
回溯、搜索
动态规划
堆栈快排等
其他
数组
数学
Description | Solution |
---|---|
n的平方根 | 二分、牛顿法 |
50. Pow(x, n) | 二分快速幂 |
剑指 Offer 16. 数值的整数次方 | 二分快速幂 |
two sum | hashmap |
剑指 Offer 14- I. 剪绳子、343. 整数拆分 | 分解为2和3 |
RandX==>RandY | randN相互生成 |
29. 两数相除 | 不使用除法做除法 |
172. 阶乘后的零 | |
204. 计数质数 | 素数筛法 |
166. 分数到小数 | 模拟除法 |
剑指 Offer 43. 1~n整数中1出现的次数、233. 数字 1 的个数 | 手动推导思路 |
149. 直线上最多的点数 | 直线斜率 |
268. 缺失数字 | 原地哈希、位运算、求和 |
面试题 16.11. 跳水板 | 数学推导 |
数字二进制中1的个数 | 右移位运算 |
136. 只出现一次的数字 | 异或 |
136. 只出现一次的数字 | 异或 |
剑指 Offer 56 - I. 数组中数字出现的次数 | 异或 |
461. 汉明距离 | 异或 |
剑指 Offer 56 - II. 数组中数字出现的次数 II | 位运算 |
剑指 Offer 65. 不用加减乘除做加法 | 异或、移位做加法 |
剑指 Offer 15. 二进制中1的个数、191. 位1的个数 | 右移 |
89. 格雷编码 | 右移 |
字符串
Description | Solution |
---|---|
压缩字符串 | list辅助记录cnt |
208. 实现 Trie (前缀树) | 前缀树 |
820. 单词的压缩编码 | 后缀树 |
212. 单词搜索 II | 前缀树 |
336. 回文对 | 前缀树 |
最小覆盖子串 | 滑动窗口 |
剑指 Offer 19. 正则表达式匹配、10. 正则表达式匹配 | 回溯 |
44. 通配符匹配 | 回溯 |
----------------------------------- | 模拟 |
13. 罗马数字转整数 | |
49. 字母异位词分组 | |
387. 字符串中的第一个唯一字符 | |
242. 有效的字母异位词 | |
剑指 Offer 67. 把字符串转换成整数 | |
剑指 Offer 58 - I. 翻转单词顺序 | |
剑指 Offer 58 - II. 左旋转字符串 | |
696. 计数二进制子串 | 模拟或者动态规划 |
459. 重复的子字符串 | |
93. 复原IP地址 | 暴力模拟 |
468. 验证IP地址 | 模拟 |
43. 字符串相乘 | 模拟竖式乘法 |
-------------------------------- | |
179. 最大数 | 自定义排序 |
剑指 Offer 45. 把数组排成最小的数 | 自定义排序 |
344. 反转字符串 | 双指针 |
剑指 Offer 58 - I. 翻转单词顺序 | 双指针 |
395. 至少有K个重复字符的最长子串 | 分治 |
剑指 Offer 20. 表示数值的字符串 | 自动机 |
链表
Description | Solution |
---|---|
剑指 Offer 18. 删除链表的节点 | |
删除重复节点I | 使用头节点,更新pre.next即可 |
删除重复节点II | |
19. 删除链表的倒数第N个节点 | 使用头节点的快慢双指针 |
!!!剑指 Offer 24. 反转链表、206. 反转链表 | 使用头节点和辅助节点tmpNode=cur.next |
!!!25. K 个一组翻转链表 | |
----------------------------------- | 链表回溯 |
剑指 Offer 06. 从尾到头打印链表 | |
143. 重排链表 | |
----------------------------------- | |
160. 相交链表 | hashmap、双指针 |
剑指 Offer 52. 两个链表的第一个公共节点 | 双指针 |
141. 环形链表、142. 环形链表 II | hashmap、快慢双指针 |
剑指 Offer 22. 链表中倒数第k个节点 | 快慢指针 |
!!!146. LRU缓存机制 | 双向链表+Hashmap |
快乐数 | 快慢指针判断环 |
链表中间节点 | 快慢指针 |
234. 回文链表 | 枚举、双指针 |
328. 奇偶链表 | 双指针 |
21. 合并两个排序的链表、剑指 Offer 25. 合并两个排序的链表 | 模拟 |
剑指 Offer 35. 复杂链表的复制 | 模拟 |
链表两数相加 II | 栈 |
138. 复制带随机指针的链表 | 两种思路模拟 |
2. 两数相加 | 模拟 |
61. 旋转链表 | 链表=>环 |
二叉树
回溯、搜索
Description | Solution |
---|---|
-------------------- | 子集、排列、组合问题 |
78. 子集 | |
90. 子集 II | |
491. 递增子序列 | 子集变形 |
842. 将数组拆分成斐波那契序列 | 子集变形 |
474. 一和零 | |
46. 全排列 | |
47. 全排列 II | |
60. 第k个排列 | |
494. 目标和 | |
39. 组合总和 | |
40. 组合总和 II | |
216. 组合总和 III | |
剑指 Offer 38. 字符串的排列 | |
77. 组合 | |
电话号码字母组合/字母大小写全排列 | 集合选择元素组合 |
-------------------------------- | |
51. N 皇后 | 经典回溯 |
79. 单词搜索 | 二维数组回溯 |
332. 重新安排行程 | |
--------------------------------- | BFS |
200. 岛屿数量 | 二维数组BFS |
130. 被围绕的区域 | 二维BFS或者并查集 |
733. 图像渲染 | 二维数组BFS |
剑指 Offer 12. 矩阵中的路径 | 二维数组DFS回溯 |
785. 判断二分图 | BFS染色 |
301. 删除无效的括号 | BFS |
133. 克隆图 | DFS或者BFS |
841. 钥匙和房间 | |
腐烂的橘子、机器人的运动范围 | 正向BFS |
最远的海洋、矩阵 | 反向BFS |
------------------------------------- | |
5. 最长回文子串 | 回文串 |
9. 回文数 | 回文串 |
409. 最长回文串 | 回文串 |
131. 分割回文串 | 画出回溯树 |
--------------------------------------- | 区间 |
647. 回文子串 | 区间DP |
516. 最长回文子序列 | 区间DP |
486. 预测赢家 |
动态规划
Description | Solution |
---|---|
----------------------------------- | 背包问题 |
01背包和完全背包代码区别 | |
322. 零钱兑换 | 完全背包 |
518. 零钱兑换 II | 完全背包 |
416. 分割等和子集 | 01最大背包 |
----------------------------------- | |
72. 编辑距离 | |
剑指 Offer 60. n个骰子的点数 | 类似编辑 |
----------------————-------- | 子序列和子串问题 |
718. 最长重复子数组 | 最长公共子串 |
1143. 最长公共子序列 | 最长公共子序列 |
子串问题dp[i][j]为以s1[i] s2[j]为结尾的子问题 | 子序列问题dp[i][j]不用以s1[i] s2[j]为结尾的子问题 |
674. 最长连续递增序列 | 注意与下面一个题目区别 O(n) |
300. 最长上升子序列 | O(n^2) |
剑指 Offer 42. 连续子数组的最大和、53. 最大子序和 | |
最大序列乘积 | |
392. 判断子序列 | 类似最长公共子序列或者双指针 |
---------------------------------- | 前面两个状态推后面一个状态 |
剑指 Offer 10- I. 斐波那契数列 | 迭代、递归、剪枝递归、通项公式、矩阵快速幂 |
剑指 Offer 10- II. 青蛙跳台阶问题、70. 爬楼梯 | |
面试金典 17.16. 按摩师、198. 打家劫舍 | dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]) |
264. 丑数 II、剑指 Offer 49. 丑数 | |
----------------------------------- | |
97. 交错字符串 | |
扔鸡蛋 | |
面试题 08.11. 硬币、322. 零钱兑换 | |
最低票价 | |
把数字翻译成字符串 | 类似于斐波那契数列 |
91. 解码方法 | dp[i]:以s[i]结尾的解码数量 |
139. 单词拆分 | dp[i]:以s[i]结尾的字符串能不能由字典表示 |
140. 单词拆分 II | 记录每个状态的中间结果。需要回溯方法才能通过 |
20. 有效的括号 | 栈 |
32. 最长有效括号 | dp[i]: 以s[i]结尾的字符串有效括号的长度 |
----------------------------------- | 路径问题 |
62. 不同路径、63. 不同路径 II | |
64. 最小路径和 | |
120. 三角形最小路径和 | |
329. 矩阵中的最长递增路径 | 回溯或者拓扑排序+二维矩阵DP |
剑指 Offer 47. 礼物的最大价值 | 二维矩阵中DP |
221. 最大正方形 | 二维矩阵中DP |
面试题 17.13. 恢复空格 | 动态规划 |
----------------------------------- | 股票问题 |
121. 买卖股票的最佳时机、剑指 Offer 63. 股票的最大利润 | 仅交易一次 |
122. 买卖股票的最佳时机 II | 不限制交易次数 |
123. 买卖股票的最佳时机 III | 2笔比交易 |
309. 最佳买卖股票时机含冷冻期 | 含有冷冻期 |
188. 买卖股票的最佳时机 IV | 仅k次交易 |
714. 买卖股票的最佳时机含手续费 | 有手续费不限制次数的交易 |
----------------------------------- | |
174. 地下城游戏 | 反向DP |
96. 不同的二叉搜索树 | DP |
95. 不同的二叉搜索树 II | 回溯 |
338. 比特位计数 | 一维DP |
312. 戳气球 | 自下向上DP |
--------------------------------------- | 区间DP |
647. 回文子串 | |
516. 最长回文子序列 | |
486. 预测赢家 | 博弈论和区间DP |
877. 石子游戏 | 博弈论和区间DP |
---------------------------------------- |
堆、栈、快排
Description | Solution |
---|---|
150. 逆波兰表达式求值 | 栈的应用 |
剑指 Offer 30. 包含min函数的栈、Leetcode 155. 最小栈 | 辅助最小栈 |
栈实现队列 、剑指 Offer 09. 用两个栈实现队列 | 辅助栈 |
剑指 Offer 31. 栈的压入、弹出序列 | 栈模拟 |
剑指 Offer 59 - II. 队列的最大值 | 单调队列 |
341. 扁平化嵌套列表迭代器 | 栈 |
----------------------------------- | 堆与快排 |
剑指 Offer 41. 数据流中的中位数、LeetCode 295. 数据流的中位数 | 大小堆 |
347. 前 K 个高频元素 | 小根堆 |
快速排序模板 | |
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 | 快排思想 |
剑指 Offer 40. 最小的k个数 | 快排思想 |
LeetCode 215. 数组中的第K个最大元素 | 全排序、局部排序、堆、快排思想 |
-------------------------------- | |
324. 摆动排序 II | partition和二分 |
207. 课程表、210. 课程表 II | 拓扑排序 |
227. 基本计算器 II | 栈 |
剑指 Offer 51. 数组中的逆序对 | 归并 |
23. 合并K个排序链表 | 优先队列或者归并 |
378. 有序矩阵中第K小的元素 | 二分或者归并 |
315. 计算右侧小于当前元素的个数 | 归并 |
148. 排序链表 | 归并 |
其他
Description | Solution |
---|---|
矩形是否相交/矩形相交面积 | IoU相关 |
统计邻居状态 | neighbor函数、CNN 卷积 |
使数组唯一的最小增量 | 贪心 |
gcd/lcm/贝祖定理 | 最大公约数、最小公倍数、二元一次方程解 |
数组最大公约数 | tmp=gcd(tmp,x) |