本页由
scripts/gen_topics.py生成,勿手编。 改题解的topics:/techniques:/元数据行后跑一次脚本即可。三级结构:套路(为什么这些题是同一类) → 技术词(具体用哪一招) → 题目。 一题可以横跨多个套路(如「接雨水」同时是数组、双指针、单调栈),各处指向的是同一份物理题解。
频次:★★★★★ 几乎必考 / ★★★★ 高频 / ★★★ 常见 / ★★ 偶考。难度:🟢 易 / 🟡 中 / 🔴 难。 难度/频次/公司以题解元数据行为权威源,本页是它的视图。公司标注为大致倾向,以实际面试为准。
怎么用这份索引
- 按套路刷,不按题号刷。每个套路先做代表题建立模式,再横向扩展变式——套路页里「为什么这些题是同一个套路」才是主线。
- 技术词是套路内部的分工。同一个套路下的技术词彼此不可替代(如双指针下的「对撞指针」与「滑动窗口」),搞混了就会硬套模板。
- 高频题(★★★★★)优先,见 高频算法题 Top 40。
- 每题留 Java 解 + 复杂度 + 一句变式;难题写关联题互链,
## 关联题是知识图谱的边。 - 推荐顺序:数组/链表/二叉树 → 双指针滑窗/二分/哈希表 → 回溯/动态规划 → 图论/栈与队列 → 排序与堆/字典树/位运算。
套路速查
共 14 个套路、57 个技术词、266 篇题解。
| 套路 | 题数 | 技术词 |
|---|---|---|
| 数组与字符串 | 43 | 原地读写指针 / 对撞指针 / 前缀和与差分 / 线性扫描维护状态 / 矩阵操作 / 模拟构造 / 滑动窗口 / 哈希查表 / 区间排序 / 摩尔投票 / 快慢指针 / 位运算 / Z字形查找 |
| 链表 | 22 | 虚拟头节点 / 三指针反转 / 快慢指针 / 节点映射 / 双指针归并 / 双指针模拟 |
| 栈与队列 | 13 | 表达式与嵌套栈 / 单调栈与单调队列 / 栈队列设计 |
| 哈希表 | 12 | 哈希查表 / 哈希+辅助结构 |
| 双指针与滑动窗口 | 13 | 对撞指针 / 滑动窗口 / 原地读写指针 / 双指针模拟 |
| 二分查找 | 10 | 二分边界 / 跳表设计 |
| 二叉树 | 39 | 递归 / 递归返回值设计 / BFS层序 / BST中序 / DFS / 树的构造与序列化 / 回溯框架 / 栈模拟递归 |
| 图论 | 22 | 图遍历 / DFS / 拓扑排序 / 并查集 / 最短路 |
| 回溯 | 17 | 回溯框架 / 剪枝 |
| 动态规划与贪心 | 62 | 线性DP / 二维DP / 股票状态机DP / 背包 / 贪心证明 / 线性扫描维护状态 / 中心扩展 |
| 排序与堆 | 12 | 排序算法实现 / 堆TopK / 快速选择 / 区间排序 / 多路归并 / 对顶堆 |
| 字典树 | 6 | Trie前缀树 / 哈希查表 |
| 位运算 | 6 | 异或自反 / 位掩码枚举 / 逐位构造 |
| 数学 | 4 | 拒绝采样 / 快速幂 / 模拟构造 |
数组与字符串
数组题的大部分”技巧”其实只有两类——用下标/原地交换省掉额外空间,或者用一次预处理把重复计算的区间查询/更新降到 O(1)。认出属于哪一类,思路就定了一半。
详解见 数组与字符串。
原地读写指针
- 26. 删除有序数组中的重复项 · 🟢 · ★★★ · 全厂
- 27. 移除元素 · 🟢 · ★★ · 全厂
- 31. 下一个排列 · 🟡 · ★★★ · 阿里
- 41. 缺失的第一个正数 · 🔴 · ★★★★ · 字节/阿里
- 88. 合并两个有序数组 · 🟢 · ★★★ · 全厂
- 151. 反转字符串中的单词 · 🟡 · ★★★★ · 字节/美团
- 189. 轮转数组 · 🟡 · ★★★ · 美团/京东
- 283. 移动零 · 🟢 · ★★★ · 美团/快手
- 448. 找到所有数组中消失的数字 · 🟢 · ★★★ · 百度
- 541. 反转字符串 II · 🟢 · ★★★ · 全厂
对撞指针
- 11. 盛最多水的容器 · 🟡 · ★★★★ · 腾讯/字节
- 15. 三数之和 · 🟡 · ★★★★★ · 字节/美团/阿里
- 42. 接雨水 · 🔴 · ★★★★★ · 字节/阿里/美团
- 344. 反转字符串 · 🟢 · ★★★ · 全厂
- 977. 有序数组的平方 · 🟢 · ★★★ · 字节
前缀和与差分
- 238. 除自身以外数组的乘积 · 🟡 · ★★★★ · 字节/阿里
- 303. 区域和检索 - 数组不可变 · 🟢 · ★★★ · 全厂
- 304. 二维区域和检索 - 矩阵不可变 · 🟡 · ★★★ · 美团
- 560. 和为 K 的子数组 · 🟡 · ★★★★ · 字节/美团
- 1094. 拼车 · 🟡 · ★★★ · 快手
- 1109. 航班预订统计 · 🟡 · ★★★ · 美团
线性扫描维护状态
- 53. 最大子数组和 · 🟢 · ★★★★★ · 全厂
- 121. 买卖股票的最佳时机 · 🟢 · ★★★★ · 全厂
- 152. 乘积最大子数组 · 🟡 · ★★★ · 字节
矩阵操作
模拟构造
- 8. 字符串转换整数 · 🟡 · ★★★★ · 字节/腾讯/美团
- 14. 最长公共前缀 · 🟢 · ★★★ · 字节/腾讯
- 28. 找出字符串中第一个匹配项的下标 · 🟡 · ★★★★ · 字节/阿里
- 43. 字符串相乘 · 🟡 · ★★★ · 腾讯/字节
- 66. 加一 · 🟢 · ★★ · 全厂
- 118. 杨辉三角 · 🟢 · ★★ · 全厂
- 415. 字符串相加 · 🟢 · ★★★★ · 字节/腾讯/美团/阿里
- 459. 重复的子字符串 · 🟢 · ★★★ · 全厂
滑动窗口
- 28. 实现 strStr() · 🟢 · ★★★ · 字节
- 209. 长度最小的子数组 · 🟡 · ★★★ · 字节/阿里
哈希查表
- 1. 两数之和 · 🟢 · ★★★★★ · 全厂
- 560. 和为 K 的子数组 · 🟡 · ★★★★ · 字节/美团
区间排序
- 56. 合并区间 · 🟡 · ★★★★ · 全厂
摩尔投票
- 169. 多数元素 · 🟢 · ★★★★ · 字节/腾讯/美团
快慢指针
- 287. 寻找重复数 · 🟡 · ★★★★ · 字节/腾讯
位运算
- 268. 缺失数字 · 🟢 · ★★★ · 字节/腾讯
Z字形查找
- 240. 搜索二维矩阵 II · 🟡 · ★★★★ · 字节/腾讯/美团
链表
链表题几乎都是指针操作的模式化组合,真正的武器只有两件——虚拟头节点(dummy)消灭”头节点要不要特判”的分支,和快慢指针。认出该用哪件武器,代码本身反而是最不费脑子的部分。
详解见 链表。
虚拟头节点
- 2. 两数相加 · 🟡 · ★★★★ · 全厂
- 19. 删除倒数第N个结点 · 🟡 · ★★★★★ · 全厂
- 21. 合并两个有序链表 · 🟢 · ★★★★★ · 全厂
- 23. 合并K个排序链表 · 🔴 · ★★★★ · 阿里/字节
- 24. 两两交换链表结点 · 🟡 · ★★★ · 美团
- 25. K个一组翻转链表 · 🔴 · ★★★★★ · 字节/阿里/腾讯
- 82. 删除排序链表中的重复元素 II · 🟡 · ★★★★ · 字节/腾讯/美团/阿里
- 92. 反转链表II · 🟡 · ★★★★ · 字节/美团
- 148. 排序链表 · 🟡 · ★★★★ · 字节/阿里
- 203. 移除链表元素 · 🟢 · ★★ · 全厂
- 707. 设计链表 · 🟡 · ★★ · 字节
三指针反转
- 25. K个一组翻转链表 · 🔴 · ★★★★★ · 字节/阿里/腾讯
- 143. 重排链表 · 🟡 · ★★★★ · 字节/腾讯/美团
- 206. 反转链表 · 🟢 · ★★★★★ · 全厂
- 234. 回文链表 · 🟢 · ★★★★ · 字节/腾讯/美团
快慢指针
- 19. 删除倒数第N个结点 · 🟡 · ★★★★★ · 全厂
- 141. 环形链表I · 🟢 · ★★★★★ · 全厂
- 142. 环形链表II · 🟡 · ★★★★★ · 字节/腾讯
- 143. 重排链表 · 🟡 · ★★★★ · 字节/腾讯/美团
- 148. 排序链表 · 🟡 · ★★★★ · 字节/阿里
- 160. 相交链表 · 🟢 · ★★★ · 快手
- 234. 回文链表 · 🟢 · ★★★★ · 字节/腾讯/美团
- 876. 链表的中间结点 · 🟢 · ★★ · 美团
节点映射
- 138. 复制带随机指针的链表 · 🟡 · ★★★★ · 字节/美团
双指针归并
- 83. 删除排序链表中的重复元素 · 🟢 · ★★★★ · 字节/美团
- 补充题1. 排序奇升偶降链表 · 🟡 · ★★★★ · 字节
双指针模拟
- 61. 旋转链表 · 🟡 · ★★★★ · 字节/腾讯
栈与队列
栈解决”最近的还没处理完”(括号匹配、表达式求值、函数调用),队列解决”先来的先处理”(层序遍历、BFS)。单调栈/单调队列是在此之上加了一条淘汰规则——不是谁都留在栈/队列里,而是只留下”未来还可能有用”的那些。
详解见 栈与队列。
表达式与嵌套栈
- 20. 有效的括号 · 🟢 · ★★★★★ · 全厂
- 150. 逆波兰表达式求值 · 🟡 · ★★★ · 百度
- 394. 字符串解码 · 🟡 · ★★★★ · 腾讯/字节
- 1047. 删除字符串中的所有相邻重复项 · 🟢 · ★★★ · 全厂
单调栈与单调队列
- 42. 接雨水 · 🔴 · ★★★★★ · 字节/阿里/美团
- 84. 柱状图中最大矩形 · 🔴 · ★★★★ · 阿里/字节
- 239. 滑动窗口最大值 · 🔴 · ★★★★★ · 字节/阿里/美团
- 496. 下一个更大元素 I · 🟢 · ★★★ · 全厂
- 503. 下一个更大元素 II · 🟡 · ★★★ · 美团
- 739. 每日温度 · 🟡 · ★★★★ · 字节/美团
栈队列设计
- 155. 最小栈 · 🟢 · ★★★★ · 字节/美团
- 225. 用队列实现栈 · 🟢 · ★★★ · 美团
- 232. 用栈实现队列 · 🟢 · ★★★ · 全厂
哈希表
哈希表把”这个东西之前见过吗/出现过几次/对应什么”这类查询降到 O(1)。凡是暴力解法里有一层”遍历前面所有元素,看有没有满足条件的”,几乎都能用哈希表把那层遍历换成一次查表。
详解见 哈希表。
哈希查表
- 1. 两数之和 · 🟢 · ★★★★★ · 全厂
- 49. 字母异位词分组 · 🟡 · ★★★★ · 美团/字节
- 128. 最长连续序列 · 🟡 · ★★★★ · 字节/阿里
- 202. 快乐数 · 🟢 · ★★★ · 全厂
- 242. 有效的字母异位词 · 🟢 · ★★★ · 全厂
- 349. 两个数组的交集 · 🟢 · ★★★ · 全厂
- 560. 和为 K 的子数组 · 🟡 · ★★★★ · 字节/美团
哈希+辅助结构
- 146. LRU缓存 · 🟡 · ★★★★★ · 阿里/字节/美团/腾讯
- 380. O(1) 时间插入、删除和获取随机元素 · 🟡 · ★★★★ · 美团/字节
- 381. O(1) 时间插入、删除和获取随机元素 - 允许重复 · 🔴 · ★★★ · 字节
- 432. 全 O(1) 的数据结构 · 🔴 · ★★★ · 阿里
- 460. LFU 缓存 · 🔴 · ★★★★ · 字节/阿里
双指针与滑动窗口
两个指针能把很多 O(n²) 的暴力枚举降到 O(n),前提是移动指针时能保证不会漏掉正确答案——这个前提是否成立,取决于指针是”对撞”还是”同向”,而滑动窗口只是”同向双指针”的一种特殊形态。
详解见 双指针与滑动窗口。
对撞指针
- 11. 盛最多水的容器 · 🟡 · ★★★★ · 腾讯/字节
- 15. 三数之和 · 🟡 · ★★★★★ · 字节/美团/阿里
- 18. 四数之和 · 🟡 · ★★★ · 字节/美团
- 42. 接雨水 · 🔴 · ★★★★★ · 字节/阿里/美团
- 167. 两数之和II-输入有序 · 🟡 · ★★★ · 全厂
滑动窗口
- 3. 无重复字符的最长子串 · 🟡 · ★★★★★ · 全厂
- 76. 最小覆盖子串 · 🔴 · ★★★★★ · 字节/阿里
- 239. 滑动窗口最大值 · 🔴 · ★★★★★ · 字节/阿里/美团
- 438. 找到字符串中所有字母异位词 · 🟡 · ★★★ · 美团
- 567. 字符串的排列 · 🟡 · ★★★ · 快手
原地读写指针
双指针模拟
- 125. 验证回文串 · 🟢 · ★★★ · 字节/腾讯/美团
二分查找
二分查找的必要条件不是”数组有序”,而是**“答案空间上存在一个单调的判定条件”**——能把问题转化成”在一段区间里找到条件由假变真的那个分界点”,就能二分,哪怕数组本身看起来是”无序”的。
详解见 二分查找。
二分边界
- 4. 寻找两个正序数组的中位数 · 🔴 · ★★★★★ · 阿里/字节/腾讯
- 33. 搜索旋转排序数组 · 🟡 · ★★★★★ · 字节/阿里/美团
- 34. 在排序数组中查找元素的第一个和最后一个位置 · 🟡 · ★★★★ · 全厂
- 剑指 Offer 53 - II. 0~n-1 中缺失的数字 · 🟢 · ★★★ · 美团
- 69. x 的平方根 · 🟢 · ★★★ · 全厂
- 74. 搜索二维矩阵 · 🟡 · ★★★ · 百度
- 153. 寻找旋转排序数组中的最小值 · 🟡 · ★★★ · 字节
- 162. 寻找峰值 · 🟡 · ★★★★ · 字节/腾讯/美团
- 704. 二分查找 · 🟢 · ★★★★ · 字节/腾讯/美团
跳表设计
- 1206. 跳表 · 🔴 · ★★★ · 字节
二叉树
几乎所有二叉树题都能套进同一个框架——“整棵树的答案 = 用根节点的信息,组合左右子树各自的答案”。想清楚”子树需要返回什么信息给父节点”,代码基本就写出来了;唯一的例外是层序遍历,它天生是迭代(BFS)而非递归的活。
详解见 二叉树。
递归
- 100. 相同的树 · 🟢 · ★★★ · 字节
- 101. 对称二叉树 · 🟢 · ★★★ · 字节
- 108. 将有序数组转换为二叉搜索树 · 🟢 · ★★★★ · 字节
- 111. 二叉树的最小深度 · 🟢 · ★★★ · 全厂
- 114. 二叉树展开为链表 · 🟡 · ★★★★ · 字节/腾讯
- 222. 完全二叉树的节点个数 · 🟡 · ★★★ · 字节/阿里
- 404. 左叶子之和 · 🟢 · ★★ · 全厂
- 617. 合并二叉树 · 🟢 · ★★ · 全厂
递归返回值设计
- 98. 验证二叉搜索树 · 🟡 · ★★★★ · 字节/美团
- 104. 二叉树的最大深度 · 🟢 · ★★★★ · 全厂
- 110. 平衡二叉树 · 🟢 · ★★★★ · 字节/美团
- 124. 二叉树中的最大路径和 · 🔴 · ★★★★ · 阿里/字节
- 226. 翻转二叉树 · 🟢 · ★★★ · 字节
- 236. 二叉树的最近公共祖先 · 🟡 · ★★★★★ · 字节/腾讯/美团
- 337. 打家劫舍 III · 🟡 · ★★★★ · 字节/阿里
- 543. 二叉树的直径 · 🟢 · ★★★★ · 美团/字节
BFS层序
- 102. 二叉树的层序遍历 · 🟡 · ★★★★★ · 全厂
- 103. 二叉树的锯齿形层序遍历 · 🟡 · ★★★★ · 字节/腾讯/美团
- 199. 二叉树的右视图 · 🟡 · ★★★ · 美团
- 513. 找树左下角的值 · 🟡 · ★★★ · 字节
- 662. 二叉树最大宽度 · 🟡 · ★★★ · 字节
- 919. 完全二叉树插入器 · 🟡 · ★★ · 百度
- 958. 二叉树的完全性检验 · 🟡 · ★★★★ · 字节/美团
BST中序
- 98. 验证二叉搜索树 · 🟡 · ★★★★ · 字节/美团
- 230. 二叉搜索树中第 K 小的元素 · 🟡 · ★★★ · 阿里
- 235. 二叉搜索树的最近公共祖先 · 🟢 · ★★★★ · 字节/阿里
- 450. 删除二叉搜索树中的节点 · 🟡 · ★★★★ · 字节/阿里
- 538. 把二叉搜索树转换为累加树 · 🟡 · ★★★ · 阿里/字节
- 669. 修剪二叉搜索树 · 🟡 · ★★★ · 字节
- 700. 二叉搜索树中的搜索 · 🟢 · ★★ · 全厂
- 701. 二叉搜索树中的插入操作 · 🟢 · ★★★ · 全厂
DFS
- 112. 路径总和 · 🟢 · ★★★ · 全厂
- 129. 求根节点到叶节点数字之和 · 🟡 · ★★★ · 字节
- 257. 二叉树的所有路径 · 🟢 · ★★★ · 美团
树的构造与序列化
- 105. 从前序与中序遍历构造二叉树 · 🟡 · ★★★★ · 字节/腾讯
- 108. 将有序数组转换为二叉搜索树 · 🟢 · ★★★★ · 字节/美团
- 297. 二叉树的序列化与反序列化 · 🔴 · ★★★★ · 字节/阿里
回溯框架
- 113. 路径总和 II · 🟡 · ★★★ · 百度
栈模拟递归
- 94. 二叉树的中序遍历 · 🟢 · ★★★★ · 字节/腾讯/美团/阿里
- 144. 二叉树的前序遍历 · 🟢 · ★★★★ · 腾讯/美团/字节
图论
图是”允许有环、允许多个父节点”的树,所以树的 DFS/BFS 在图上全部适用,只是多了一件必须做的事——记录访问过的节点,否则会在环里死循环。图论题的额外技巧(拓扑排序、并查集)都是为了处理树没有的两个新问题:依赖顺序和动态连通性。
详解见 图论。
图遍历
- 127. 单词接龙 · 🔴 · ★★★★ · 字节/阿里/腾讯
- 133. 克隆图 · 🟡 · ★★★ · 腾讯
- 200. 岛屿数量 · 🟡 · ★★★★★ · 全厂
- 417. 太平洋大西洋水流 · 🟡 · ★★★ · 美团
- 797. 所有可能的路径 · 🟡 · ★★★ · 快手
- 841. 钥匙和房间 · 🟡 · ★★★ · 字节
- 994. 腐烂的橘子 · 🟡 · ★★★★ · 美团/字节
DFS
- 130. 被围绕的区域 · 🟡 · ★★★★ · 字节/阿里/腾讯
- 463. 岛屿的周长 · 🟢 · ★★★ · 字节
- 695. 岛屿的最大面积 · 🟡 · ★★★★ · 字节/阿里
- 827. 最大人工岛 · 🔴 · ★★★★ · 字节/阿里
- 1020. 飞地的数量 · 🟡 · ★★★ · 字节
拓扑排序
- 剑指 Offer II 14. 拓扑排序模板 · 🟡 · ★★★ · 美团
- 207. 课程表 · 🟡 · ★★★★★ · 字节/阿里/美团
- 210. 课程表 II · 🟡 · ★★★★ · 字节
- 802. 找到最终的安全状态 · 🟡 · ★★★ · 阿里
并查集
- 547. 省份数量 · 🟡 · ★★★★ · 字节
- 684. 冗余连接 · 🟡 · ★★★ · 美团
- 685. 冗余连接 II · 🔴 · ★★★★ · 字节/阿里
- 990. 等式方程的可满足性 · 🟡 · ★★★ · 阿里
- 1319. 连通网络的操作次数 · 🟡 · ★★★ · 快手
最短路
- 787. K 站中转内最便宜的航班 · 🟡 · ★★★★ · 字节
回溯
回溯就是 DFS 加上一句”撤销现场”——穷举所有可能解的通用框架是「做选择 → 递归进入下一层 → 撤销选择」,三步缺一不可。写不出撤销那一步,是这类题最常见的翻车原因。
详解见 回溯。
回溯框架
- 17. 电话号码的字母组合 · 🟡 · ★★★★ · 美团/字节
- 22. 括号生成 · 🟡 · ★★★★★ · 字节/阿里/腾讯
- 37. 解数独 · 🔴 · ★★★ · 阿里
- 39. 组合总和 · 🟡 · ★★★★★ · 字节/美团
- 40. 组合总和 II · 🟡 · ★★★ · 阿里
- 46. 全排列 · 🟡 · ★★★★★ · 全厂
- 47. 全排列 II · 🟡 · ★★★★ · 字节/美团
- 51. N 皇后 · 🔴 · ★★★★ · 字节/阿里
- 77. 组合 · 🟡 · ★★★★ · 字节/阿里
- 78. 子集 · 🟡 · ★★★★★ · 全厂
- 79. 单词搜索 · 🟡 · ★★★★ · 字节/腾讯
- 90. 子集 II · 🟡 · ★★★ · 美团
- 93. 复原 IP 地址 · 🟡 · ★★★ · 快手
- 131. 分割回文串 · 🟡 · ★★★ · 美团
- 216. 组合总和 III · 🟡 · ★★★ · 字节
- 332. 重新安排行程 · 🔴 · ★★★ · 字节/阿里
- 491. 非递减子序列 · 🟡 · ★★★ · 字节
剪枝
- 22. 括号生成 · 🟡 · ★★★★★ · 字节/阿里/腾讯
- 37. 解数独 · 🔴 · ★★★ · 阿里
- 39. 组合总和 · 🟡 · ★★★★★ · 字节/美团
- 40. 组合总和 II · 🟡 · ★★★ · 阿里
- 47. 全排列 II · 🟡 · ★★★★ · 字节/美团
- 51. N 皇后 · 🔴 · ★★★★ · 字节/阿里
- 79. 单词搜索 · 🟡 · ★★★★ · 字节/腾讯
- 90. 子集 II · 🟡 · ★★★ · 美团
- 93. 复原 IP 地址 · 🟡 · ★★★ · 快手
- 131. 分割回文串 · 🟡 · ★★★ · 美团
动态规划与贪心
动态规划和贪心都是”不穷举所有解,靠某个性质剪掉大部分选择”,区别在于动态规划把每一步的所有候选都存下来供后面复用,贪心直接证明”每一步只保留一个候选就够了”。判断一道题该用哪个,比写出代码本身更考验功力,也是这一页真正的价值所在。
详解见 动态规划与贪心。
线性DP
- 32. 最长有效括号 · 🔴 · ★★★★ · 字节
- 53. 最大子数组和 · 🟢 · ★★★★★ · 全厂
- 70. 爬楼梯 · 🟢 · ★★★★★ · 全厂
- 91. 解码方法 · 🟡 · ★★★ · 字节/美团
- 96. 不同的二叉搜索树 · 🟡 · ★★★★ · 字节/阿里
- 152. 乘积最大子数组 · 🟡 · ★★★ · 字节
- 198. 打家劫舍 · 🟢 · ★★★★★ · 全厂
- 213. 打家劫舍 II · 🟡 · ★★★★ · 美团
- 300. 最长递增子序列 · 🟡 · ★★★★★ · 字节/阿里/美团
- 343. 整数拆分 · 🟡 · ★★★ · 字节/腾讯
- 509. 斐波那契数 · 🟢 · ★★★ · 全厂
- 674. 最长连续递增序列 · 🟢 · ★★★ · 字节
- 746. 使用最小花费爬楼梯 · 🟢 · ★★★ · 字节
二维DP
- 10. 正则表达式匹配 · 🔴 · ★★★ · 字节/阿里
- 62. 不同路径 · 🟡 · ★★★ · 全厂
- 63. 不同路径 II · 🟡 · ★★★ · 美团
- 64. 最小路径和 · 🟡 · ★★★★ · 美团
- 72. 编辑距离 · 🔴 · ★★★★★ · 字节/阿里/腾讯
- 115. 不同的子序列 · 🔴 · ★★★★ · 字节/阿里
- 120. 三角形最小路径和 · 🟡 · ★★★ · 腾讯/美团
- 221. 最大正方形 · 🟡 · ★★★★ · 字节/美团
- 312. 戳气球 · 🔴 · ★★★ · 阿里
- 392. 判断子序列 · 🟢 · ★★★ · 字节
- 516. 最长回文子序列 · 🟡 · ★★★★ · 字节/腾讯
- 583. 两个字符串的删除操作 · 🟡 · ★★★ · 字节
- 718. 最长重复子数组 · 🟡 · ★★★★ · 字节/腾讯
- 1035. 不相交的线 · 🟡 · ★★★ · 字节
- 1143. 最长公共子序列 · 🟡 · ★★★★★ · 字节/腾讯
- 补充题2. 圆环回原点问题 · 🟡 · ★★★★ · 字节
股票状态机DP
- 123. 买卖股票的最佳时机 III · 🔴 · ★★★★ · 字节/阿里/腾讯
- 188. 买卖股票的最佳时机 IV · 🔴 · ★★★ · 字节
- 309. 买卖股票的最佳时机含冷冻期 · 🟡 · ★★★ · 阿里
- 714. 买卖股票的最佳时机含手续费 · 🟡 · ★★★ · 快手
背包
- 139. 单词拆分 · 🟡 · ★★★★ · 字节/阿里
- 279. 完全平方数 · 🟡 · ★★★★ · 字节/腾讯
- 322. 零钱兑换 · 🟡 · ★★★★★ · 字节/美团/阿里
- 377. 组合总和 IV · 🟡 · ★★★ · 字节
- 416. 分割等和子集 · 🟡 · ★★★★ · 美团/字节
- 474. 一和零 · 🟡 · ★★★ · 字节
- 494. 目标和 · 🟡 · ★★★★ · 字节/腾讯
- 518. 零钱兑换 II · 🟡 · ★★★★ · 字节/腾讯/美团
- 518. 零钱兑换 II · 🟡 · ★★★★ · 字节/美团
- 1049. 最后一块石头的重量 II · 🟡 · ★★★ · 字节
贪心证明
- 45. 跳跃游戏 II · 🟡 · ★★★★ · 字节/阿里
- 55. 跳跃游戏 · 🟡 · ★★★★ · 字节/美团
- 122. 买卖股票的最佳时机 II · 🟡 · ★★★★ · 美团
- 134. 加油站 · 🟡 · ★★★ · 字节
- 135. 分发糖果 · 🔴 · ★★★★ · 字节/阿里/腾讯
- 376. 摆动序列 · 🟡 · ★★★ · 字节/美团
- 406. 根据身高重建队列 · 🟡 · ★★★ · 阿里
- 435. 无重叠区间 · 🟡 · ★★★★ · 字节
- 452. 用最少数量的箭引爆气球 · 🟡 · ★★★★ · 字节/阿里
- 455. 分发饼干 · 🟢 · ★★★ · 字节
- 621. 任务调度器 · 🟡 · ★★★★ · 字节/美团
- 738. 单调递增的数字 · 🟡 · ★★★ · 字节
- 763. 划分字母区间 · 🟡 · ★★★ · 美团
- 860. 柠檬水找零 · 🟢 · ★★★ · 字节
- 968. 监控二叉树 · 🔴 · ★★★★ · 字节/阿里
- 1005. K 次取反后最大化的数组和 · 🟢 · ★★★ · 字节
线性扫描维护状态
- 53. 最大子数组和 · 🟢 · ★★★★★ · 全厂
- 121. 买卖股票的最佳时机 · 🟢 · ★★★★ · 全厂
- 152. 乘积最大子数组 · 🟡 · ★★★ · 字节
中心扩展
排序与堆
需要”全部有序”就用排序;只需要”前 K 个”或”动态维护当前最值”,用堆——堆的本质是一棵只保证”父节点比子节点更优”、不要求兄弟节点之间有序的弱化二叉树,正是这个弱化换来了 O(log n) 的插入/取出,比维护整体有序便宜得多。
详解见 排序与堆。
排序算法实现
- 剑指 Offer 45. 把数组排成最小的数 · 🟡 · ★★★ · 阿里
- 75. 颜色分类 · 🟡 · ★★★★ · 字节/腾讯
- 912. 排序数组 · 🟡 · ★★★★★ · 字节/阿里/美团
堆TopK
- 剑指 Offer 40. 最小的 K 个数 · 🟢 · ★★★★ · 全厂
- 215. 数组中的第 K 个最大元素 · 🟡 · ★★★★★ · 全厂
- 347. 前 K 个高频元素 · 🟡 · ★★★★ · 美团/字节
- 703. 数据流中的第 K 大元素 · 🟢 · ★★★ · 美团
快速选择
- 215. 数组中的第 K 个最大元素 · 🟡 · ★★★★★ · 全厂
区间排序
- 56. 合并区间 · 🟡 · ★★★★ · 全厂
- 252. 会议室 · 🟢 · ★★★ · 字节
- 253. 会议室 II · 🟡 · ★★★★ · 字节/美团
多路归并
- 23. 合并K个排序链表 · 🔴 · ★★★★ · 阿里/字节
对顶堆
- 295. 数据流的中位数 · 🔴 · ★★★★ · 字节/阿里
字典树
字典树(Trie)是”用公共前缀换空间和查询效率”的哈希表替代品——当查询模式是”前缀匹配”而不是”精确匹配”时,哈希表无能为力(它只能判断整个字符串是否存在),字典树天然适合。
详解见 字典树。
Trie前缀树
- 208. 实现 Trie · 🟡 · ★★★★ · 字节/美团
- 211. 添加与搜索单词 · 🟡 · ★★★ · 字节
- 212. 单词搜索 II · 🔴 · ★★★ · 阿里
- 648. 单词替换 · 🟡 · ★★ · 美团
- 677. 键值映射 · 🟡 · ★★★ · 百度
- 720. 词典中最长的单词 · 🟢 · ★★ · 快手
哈希查表
- 720. 词典中最长的单词 · 🟢 · ★★ · 快手
位运算
位运算题的价值几乎都来自异或(XOR)的两条性质——自反性(
a^a=0)让”找落单元素”不需要额外空间,无进位加法的特性让它能模拟加法。认出题目在利用哪一条,解法基本就出来了。
详解见 位运算。
异或自反
- 136. 只出现一次的数字 · 🟢 · ★★★★ · 全厂
- 260. 只出现一次的数字 III · 🟡 · ★★★ · 字节
位掩码枚举
- 78. 子集 · 🟡 · ★★★★★ · 全厂
逐位构造
- 338. 比特位计数 · 🟢 · ★★★ · 美团
- 371. 两整数之和 · 🟡 · ★★★ · 阿里
- 461. 汉明距离 · 🟢 · ★★★ · 字节
数学
数学题在算法面试中的考察点往往不是高深的数论,而是如何把现实问题抽象成数学模型,再用程序表达——拒绝采样、概率均等、模运算性质是最高频的三个工具。
详解见 数学。
拒绝采样
- 470. 用 Rand7() 实现 Rand10() · 🟡 · ★★★★ · 字节/腾讯
快速幂
- 50. Pow(x, n) · 🟡 · ★★★★ · 字节/腾讯