我最近又把 LeetCode Hot100 过了一遍。
不是因为它有多神,而是因为到研究生阶段你会发现:算法题这东西,一段时间不碰,手感掉得非常快。尤其是平时做科研、写工程代码比较多的时候,脑子会更习惯“大系统逻辑”,反而不够敏感于题目里的局部结构。
所以这篇不写“我刷了多少题”,只写我觉得真正有用的经验。
1. Hot100 不是题单,是模板训练集
很多人刷 Hot100 的方式是:
- 做一道
- 过一道
- 收藏一道
- 然后下一道
最后刷完了,问他双指针模板是什么、二叉树 DFS 怎么快速写、动态规划怎么定义状态,还是卡住。
这就说明,你刷的是题,不是方法。
我现在更认可的一种说法是:
Hot100 的价值,不在于 100 这个数字,而在于它能帮你把高频题型压缩成有限的思维模板。
2. 我会把 Hot100 分成这几类来刷
第一类:哈希 / 数组 / 双指针
这一类是最适合恢复手感的。
因为它们通常:
- 代码量不大;
- 反馈快;
- 容易建立“看题识型”的感觉。
像这些思路一定要练熟:
- 两数之和:哈希
- 三数之和:排序 + 双指针
- 盛最多水的容器:对撞双指针
- 移动零:快慢指针
如果这一类都经常卡,那后面更复杂的题型大概率也会乱。
第二类:链表
链表题最大的特点不是难,而是特别容易写乱。
我自己的习惯是,把链表题统一先想清楚三件事:
- 要不要 dummy 节点;
- 当前操作涉及几个指针;
- 修改指针前有没有保存后继。
像反转链表、合并链表、删除倒数第 N 个结点、环形链表,这几道其实就能把常见套路覆盖掉很多。
第三类:栈 / 队列 / 单调栈
这一类题一旦模板形成,速度会提得很明显。
尤其是:
- 有效括号
- 最小栈
- 每日温度
- 柱状图中最大的矩形
这里我最大的体会是:
单调栈不难,难的是你没把“维护什么单调性”这句话想明白。
第四类:二叉树
二叉树是 Hot100 的大头之一,也是最容易让人看起来会、实际写起来慢的部分。
我会强行把自己训练成看到树题先问:
- 这是前中后序哪种 DFS;
- 要不要层序 BFS;
- 这是“遍历型递归”还是“分解型递归”;
- 返回值到底代表什么。
比如:
- 最大深度
- 对称二叉树
- 二叉树展开为链表
- 最近公共祖先
这些题表面不同,但很多时候底层思路是通的。
第五类:回溯
回溯题非常适合练代码组织能力。
我的经验是,不要一上来就怕。先把这几个元素固定下来:
- 路径 path
- 选择列表 choices
- 结束条件
- 回退动作
子集、全排列、组合总和、括号生成,这一套顺下来以后,回溯基本盘就差不多有了。
第六类:动态规划
很多人怕 DP,其实根本原因通常不是不会转移,而是不知道状态该怎么定义。
我自己现在做 DP 题,强迫自己先写这四句:
dp[i]/dp[i][j]表示什么;- 初始值是什么;
- 转移从哪里来;
- 最终答案取哪里。
像:
- 爬楼梯
- 打家劫舍
- 最长递增子序列
- 零钱兑换
- 编辑距离
这些题并不一定一遍就秒,但只要你把状态定义练出来,后面会顺很多。
第七类:图 / BFS / 二分 / 堆
这一类在面试里也常见,而且常和前面题型交叉。
比如:
- 岛屿数量:DFS / BFS
- 腐烂的橘子:多源 BFS
- 搜索旋转排序数组:二分
- 数组中的第 K 个最大元素:堆 / 快排思想
这里我比较建议按“场景”记,而不是按题号记。
3. 我现在刷题,基本只做三件事
1. 归类
每做完一道题,我都会给它贴一个主标签:
- 双指针
- 哈希
- 树 DFS
- 回溯
- DP
- 二分
这样后面复习的时候,不是重做整本题单,而是按题型补弱项。
2. 总结模板
比如我会专门维护一些非常短的模板:
- 二叉树递归模板
- 层序遍历模板
- 回溯模板
- 二分模板
- 单调栈模板
- 链表 dummy 模板
模板不是为了背代码,而是为了在高压场景下快速起手。
3. 二刷和三刷
一道题一遍做出来,不代表你真的会。
尤其是面试常考题,最好过几天再做一次。只有到了你能在比较短时间内重新写出来,才算真的内化。
4. 我觉得最容易踩的坑
坑一:盲目追数量
刷 300 道但没有形成方法,不如把 Hot100 真正吃透。
坑二:只看题解,不自己写
看懂和写出来之间,差得非常多。
坑三:语言细节不熟
尤其是 C++ / Python 常用容器、排序、自定义比较器、堆、哈希表的写法,不熟的话会影响你整场状态。
坑四:不会复盘
卡过的题如果不记录,下次还会卡在同一个地方。
5. 如果是为了实习 / 秋招,我建议怎么安排
如果你是为了找实习或者秋招面试,我会建议:
第一阶段:Hot100 过一遍,建立模板
别急着求快。
第二阶段:按题型补短板
哪一类老错,就集中练哪一类。
第三阶段:限时训练
模拟真实面试节奏,练表达和代码书写速度。
第四阶段:回看高频经典题
不要把所有时间都花在新题上,经典题的收益通常更高。
6. 我现在对刷题这件事的看法
以前我会觉得,刷题就是一种“必须忍受”的门槛。
现在反而觉得,它至少有两个好处:
- 让你在有限时间里快速恢复基础数据结构和算法直觉;
- 让你的代码组织能力变得更干净。
当然,刷题不能替代真实开发,也不能替代系统设计和工程经验。但如果你目标里包含实习、秋招、技术面试,那 Hot100 的性价比依然很高。
最后还是那句话:
不要把刷完 100 道当成终点。
真正有用的是,你最后有没有在脑子里形成一套“看到题目就能迅速归类、起手、推进”的模板体系。这个东西,才会在面试那几分钟真正救你。