高频面试题

高频题怎么刷

这一篇是反向索引

前面 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 道配套题。回头看,整本书其实只讲了三件事:

  1. 数据结构的差别全在「约束」上 —— 数组连续、链表不连续; BST 全序、堆只管父子;每种约束换来一种速度
  2. 递归有两种视角 —— 遍历视角关注路径(回溯、DFS), 子问题视角关注返回值(分治、动规)。 二叉树那一章是全书枢纽
  3. 认出题型比想出解法重要 —— 这一篇就是干这个的

祝面试顺利。