高友谊

记录科研、技术与思考

LeetCode Hot100 刷题经验:不是刷完 100 道就够了,而是要形成模板

我最近又把 LeetCode Hot100 过了一遍。

不是因为它有多神,而是因为到研究生阶段你会发现:算法题这东西,一段时间不碰,手感掉得非常快。尤其是平时做科研、写工程代码比较多的时候,脑子会更习惯“大系统逻辑”,反而不够敏感于题目里的局部结构。

所以这篇不写“我刷了多少题”,只写我觉得真正有用的经验。

1. Hot100 不是题单,是模板训练集

很多人刷 Hot100 的方式是:

  • 做一道
  • 过一道
  • 收藏一道
  • 然后下一道

最后刷完了,问他双指针模板是什么、二叉树 DFS 怎么快速写、动态规划怎么定义状态,还是卡住。

这就说明,你刷的是题,不是方法。

我现在更认可的一种说法是:

Hot100 的价值,不在于 100 这个数字,而在于它能帮你把高频题型压缩成有限的思维模板。

2. 我会把 Hot100 分成这几类来刷

第一类:哈希 / 数组 / 双指针

这一类是最适合恢复手感的。

因为它们通常:

  • 代码量不大;
  • 反馈快;
  • 容易建立“看题识型”的感觉。

像这些思路一定要练熟:

  • 两数之和:哈希
  • 三数之和:排序 + 双指针
  • 盛最多水的容器:对撞双指针
  • 移动零:快慢指针

如果这一类都经常卡,那后面更复杂的题型大概率也会乱。

第二类:链表

链表题最大的特点不是难,而是特别容易写乱。

我自己的习惯是,把链表题统一先想清楚三件事:

  1. 要不要 dummy 节点;
  2. 当前操作涉及几个指针;
  3. 修改指针前有没有保存后继。

像反转链表、合并链表、删除倒数第 N 个结点、环形链表,这几道其实就能把常见套路覆盖掉很多。

第三类:栈 / 队列 / 单调栈

这一类题一旦模板形成,速度会提得很明显。

尤其是:

  • 有效括号
  • 最小栈
  • 每日温度
  • 柱状图中最大的矩形

这里我最大的体会是:

单调栈不难,难的是你没把“维护什么单调性”这句话想明白。

第四类:二叉树

二叉树是 Hot100 的大头之一,也是最容易让人看起来会、实际写起来慢的部分。

我会强行把自己训练成看到树题先问:

  • 这是前中后序哪种 DFS;
  • 要不要层序 BFS;
  • 这是“遍历型递归”还是“分解型递归”;
  • 返回值到底代表什么。

比如:

  • 最大深度
  • 对称二叉树
  • 二叉树展开为链表
  • 最近公共祖先

这些题表面不同,但很多时候底层思路是通的。

第五类:回溯

回溯题非常适合练代码组织能力。

我的经验是,不要一上来就怕。先把这几个元素固定下来:

  • 路径 path
  • 选择列表 choices
  • 结束条件
  • 回退动作

子集、全排列、组合总和、括号生成,这一套顺下来以后,回溯基本盘就差不多有了。

第六类:动态规划

很多人怕 DP,其实根本原因通常不是不会转移,而是不知道状态该怎么定义。

我自己现在做 DP 题,强迫自己先写这四句:

  1. dp[i] / dp[i][j] 表示什么;
  2. 初始值是什么;
  3. 转移从哪里来;
  4. 最终答案取哪里。

像:

  • 爬楼梯
  • 打家劫舍
  • 最长递增子序列
  • 零钱兑换
  • 编辑距离

这些题并不一定一遍就秒,但只要你把状态定义练出来,后面会顺很多。

第七类:图 / BFS / 二分 / 堆

这一类在面试里也常见,而且常和前面题型交叉。

比如:

  • 岛屿数量:DFS / BFS
  • 腐烂的橘子:多源 BFS
  • 搜索旋转排序数组:二分
  • 数组中的第 K 个最大元素:堆 / 快排思想

这里我比较建议按“场景”记,而不是按题号记。

3. 我现在刷题,基本只做三件事

1. 归类

每做完一道题,我都会给它贴一个主标签:

  • 双指针
  • 哈希
  • 树 DFS
  • 回溯
  • DP
  • 二分

这样后面复习的时候,不是重做整本题单,而是按题型补弱项。

2. 总结模板

比如我会专门维护一些非常短的模板:

  • 二叉树递归模板
  • 层序遍历模板
  • 回溯模板
  • 二分模板
  • 单调栈模板
  • 链表 dummy 模板

模板不是为了背代码,而是为了在高压场景下快速起手。

3. 二刷和三刷

一道题一遍做出来,不代表你真的会。

尤其是面试常考题,最好过几天再做一次。只有到了你能在比较短时间内重新写出来,才算真的内化。

4. 我觉得最容易踩的坑

坑一:盲目追数量

刷 300 道但没有形成方法,不如把 Hot100 真正吃透。

坑二:只看题解,不自己写

看懂和写出来之间,差得非常多。

坑三:语言细节不熟

尤其是 C++ / Python 常用容器、排序、自定义比较器、堆、哈希表的写法,不熟的话会影响你整场状态。

坑四:不会复盘

卡过的题如果不记录,下次还会卡在同一个地方。

5. 如果是为了实习 / 秋招,我建议怎么安排

如果你是为了找实习或者秋招面试,我会建议:

第一阶段:Hot100 过一遍,建立模板

别急着求快。

第二阶段:按题型补短板

哪一类老错,就集中练哪一类。

第三阶段:限时训练

模拟真实面试节奏,练表达和代码书写速度。

第四阶段:回看高频经典题

不要把所有时间都花在新题上,经典题的收益通常更高。

6. 我现在对刷题这件事的看法

以前我会觉得,刷题就是一种“必须忍受”的门槛。

现在反而觉得,它至少有两个好处:

  • 让你在有限时间里快速恢复基础数据结构和算法直觉;
  • 让你的代码组织能力变得更干净。

当然,刷题不能替代真实开发,也不能替代系统设计和工程经验。但如果你目标里包含实习、秋招、技术面试,那 Hot100 的性价比依然很高。

最后还是那句话:

不要把刷完 100 道当成终点。

真正有用的是,你最后有没有在脑子里形成一套“看到题目就能迅速归类、起手、推进”的模板体系。这个东西,才会在面试那几分钟真正救你。