高频面试题
高频题怎么刷
这一篇是反向索引
前面 54 篇是按知识依赖组织的:先学什么、再学什么。 那个顺序适合从头读,但不适合做题时查。
拿到一道陌生的题,你手里只有题面,不知道它属于哪一章。 所以这一篇按「题目长什么样」重新组织一遍 —— 从题干的特征反查该用哪套框架。
从题干特征反查
| 题干里出现 | 大概率是 | 回去看 |
|---|---|---|
| 「连续的子数组 / 子串」+ 求最长最短 | 滑动窗口 | 滑动窗口 |
| 「有序数组」+ 查找 | 二分搜索 | 二分搜索 |
| 「最小的最大值」「至少需要多少」 | 二分答案 | 二分搜索 |
| 「原地」修改数组、移除元素 | 快慢指针 + 覆盖 | 数组基础 |
| 反复查询「区间和」 | 前缀和 | 前缀和 |
| 反复对「区间整体加减」 | 差分数组 | 差分数组 |
| 链表 + 「倒数第 k 个 / 中点 / 环」 | 链表双指针 | 链表双指针 |
| 「下一个更大 / 更小的元素」 | 单调栈 | 栈与队列 |
| 滑动窗口里求最值 | 单调队列 | 栈与队列 |
| 「设计一个 XXX,操作要 O(1)」 | 哈希表 + 另一个结构 | 数据结构设计题 |
| 二叉树,且要「路径」 | 遍历视角 | 两种思维 |
| 二叉树,且子问题的答案能拼出原答案 | 子问题视角 | 两种思维 |
| 「所有排列 / 组合 / 子集」 | 回溯 | 回溯算法框架 |
| 网格 + 「连通的一片」「岛屿」 | DFS + 淹没 | DFS 与网格题 |
| 「最少几步」,每步代价相同 | BFS | BFS 算法框架 |
| 「最短路径」,边有权重 | Dijkstra | Dijkstra |
| 要任意两点之间的距离,或边权可能为负 | Floyd | Floyd 多源最短路 |
| 求最值 + 有重叠子问题 | 动态规划 | 动规框架 |
| 「从一堆里挑,有容量上限」 | 背包 | 背包问题 |
| 两个字符串对比 | 二维 DP | 子序列问题 |
| 要拿很多子串互相比(找重复、二分长度) | 字符串哈希 | 字符串哈希 |
| 「前 k 大 / 前 k 小」 | 堆 | 二叉堆 |
| 「前缀匹配」「自动补全」 | 字典树 | 字典树 |
| 「这两个点连不连通」+ 边动态加 | 并查集 | 并查集 |
| 「课程表」「任务依赖」 | 拓扑排序 | 图的表示与遍历 |
🚨 三对最容易认错的
① 滑动窗口 vs 前缀和 + 哈希表
两者都处理「连续子数组」。判据是有没有负数: 有负数时窗口不再单调(加一个元素和可能变小),滑窗失效, 要换成前缀和 + 哈希表。
② 贪心 vs 动态规划
都在求最值。判据是贪心选择性质成不成立 —— 而这不能靠试几个例子判断(那篇给了两个「试几个例子都对」的反例)。 ⚠️ 拿不准就选 DP:贪心错了是答案错,DP 慢了只是慢。
③ 分治 vs 动态规划
框架长得一样,区别只有一条:子问题会不会重叠。 不重叠是分治,重叠就要加备忘录。 ⚠️ 同样是不对称的:该加没加是指数超时,不该加却加了只多花点内存。
刷题的顺序
📌 按题型分组刷,不要按题号顺序刷。
按题号刷,相邻两题往往毫不相干,每道题都要重新起一次思路, 练的是「临场想出办法」——那是运气。 按题型刷,同一套模板连着用五遍,练的是肌肉记忆。
⭐ 具体做法:从上面那张表里挑一行,回去把对应的框架文章读透, 然后连着做 5~8 道同类型的题。做完再换下一行。
关于配套题目
绝大多数框架文章末尾都配了 5~7 道题,一共 257 道,全部来自力扣。
⚠️ 有几篇例外,都在随机化与近似结构那一章: 布隆过滤器、一致性哈希、限流器在力扣上没有对应题目 —— 它们是面试问答题, 不是判题器上的题。那几篇配的是「最接近的思路题」,或者干脆没有。 📌 这不是漏了,是那一类知识本来就不靠刷题掌握。 它们不是随机挑的 —— 每道题旁边写着「这题考什么」, 指向的是本篇里的某个具体的点(比如「⭐ i > start 而不是 i > 0」)。
⚖️ 那些表格里只有题号、官方标题和链接,没有题面复述。 平台的题面文字是有版权的;而「这题考什么」那一列写的是本站自己的内容。
⭐ 题号和标题不是凭记忆写的:全部 257 道对着力扣的公开题目数据核过, 题号与难度用两个独立接口交叉验证,零分歧,并抽样确认链接可访问。 (这一点值得说明,因为整本书写作过程中错得最多的恰恰就是「具体数字」。)
📌 本站不再单独提供一份题单。原因是:题单要么直接搬平台的分类 (没有增量价值),要么需要长期维护题目状态(题目会改、会下架)。 按框架分组的那 257 道已经覆盖了主流题单的绝大部分, 而且比题单多了一层「它对应哪个知识点」。
全书到此为止
14 章、55 篇、257 道配套题。回头看,整本书其实只讲了三件事:
- 数据结构的差别全在「约束」上 —— 数组连续、链表不连续; BST 全序、堆只管父子;每种约束换来一种速度
- 递归有两种视角 —— 遍历视角关注路径(回溯、DFS), 子问题视角关注返回值(分治、动规)。 二叉树那一章是全书枢纽
- 认出题型比想出解法重要 —— 这一篇就是干这个的
祝面试顺利。