- 自己能在面试中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) |
本文详述了面试中常见的编程技巧,包括数组、数学、字符串、链表、二叉树、回溯、搜索、动态规划、堆栈、快排等领域的核心知识点,如双指针、滑动窗口、动态规划、二分查找等。通过实例解析,帮助读者巩固和提升编程能力。
487

被折叠的 条评论
为什么被折叠?



