Appearance
如何高效刷题:框架思维 vs 题海战术
场景引入
小明刷了 800 道 LeetCode,面试时遇到一道没见过的题,还是不会。小红只刷了 150 道,但她能在 20 分钟内拆解大部分 Medium 题。
差别在哪?不是智商,是学习方法。
小明是"题海战术"——每道题当成独立问题来解,记住答案。小红是"框架思维"——把题目按技巧分类,掌握每类题的通用模板,遇到新题先识别类型再套框架。
为什么题海战术不管用
题目是刷不完的
LeetCode 目前有 3000+ 道题,还在持续增加。靠记忆来覆盖所有题目是不现实的。
记忆会衰退
今天背下来的解法,两周后就忘了。没有理解的记忆是脆弱的。你可能会有这种体验:这道题我三个月前明明做过,但现在完全想不起来怎么做。
面试题会变形
面试官经常对经典题做微调:改个条件、换个数据结构、加个限制。如果你只记住了原题的解法,变形题就束手无策。
框架思维是什么
框架思维的核心观点:算法题的数量是无限的,但解题技巧是有限的。
常见的算法技巧不超过 20 种:
| 类别 | 核心技巧 |
|---|---|
| 数组 | 双指针、滑动窗口、前缀和、二分查找 |
| 链表 | 快慢指针、虚拟头节点、反转 |
| 树 | DFS(前/中/后序)、BFS(层序)、递归分解 |
| 图 | BFS、DFS、拓扑排序、并查集 |
| 动态规划 | 状态定义、转移方程、base case |
| 回溯 | 选择列表、路径、结束条件 |
| 贪心 | 局部最优、排序预处理 |
每种技巧都有一个通用模板。掌握模板后,同类型的题目只需要微调细节。
示例:回溯框架
所有回溯题(全排列、组合、子集、N 皇后……)都可以用同一个框架:
javascript
function backtrack(路径, 选择列表) {
if (满足结束条件) {
result.push(路径);
return;
}
for (const 选择 of 选择列表) {
做选择; // 路径.push(选择)
backtrack(路径, 选择列表);
撤销选择; // 路径.pop()
}
}LC 46 全排列、LC 78 子集、LC 39 组合总和——看似不同的题目,核心代码结构完全一样。区别只在于:
- 结束条件不同
- 选择列表的生成方式不同
- 是否需要剪枝
一个框架,解决一类问题。 这就是框架思维的威力。
如何按框架学习
第一步:按技巧分类,而非按题号刷
不要从 LC 1 刷到 LC 100。正确的做法是:
- 选一个专题(比如"滑动窗口")
- 先学通用框架和核心思路
- 做 5-8 道该专题的题目
- 总结变化规律,再进入下一个专题
第二步:每道题经历四个阶段
| 阶段 | 时间 | 做什么 |
|---|---|---|
| 审题 | 5 分钟 | 读清题意,识别问题类型,想到可能适用的框架 |
| 思考 | 10 分钟 | 独立思考解法,不要急着写代码 |
| 编码 | 15 分钟 | 写代码,运行测试 |
| 复盘 | 10 分钟 | 对照最优解,分析差距,记录心得 |
关键规则:如果思考 15 分钟完全没有头绪,就看提示或解析。不要死磕——在学习阶段,效率比自尊心更重要。
第三步:做题不是目的,总结才是
每做完一个专题,问自己三个问题:
- 这类题的通用框架是什么? 能否默写出来?
- 题目之间的差异在哪? 哪些地方需要微调?
- 常见的坑有哪些? 边界条件、特殊情况?
把答案写下来。这份笔记比刷题数量重要 10 倍。
推荐学习顺序
本系列教程的章节编排就是推荐的学习路径,按照由浅入深、前后依赖的逻辑设计:
第一阶段:打基础(1-2 周)
- 复杂度分析 —— 后续所有章节都需要分析复杂度
- 数组基础 —— 双指针、滑动窗口
- 哈希表 —— 最常用的辅助数据结构
- 栈与队列 —— 单调栈、BFS 的基础
第二阶段:核心技巧(3-4 周)
- 链表 —— 指针操作、快慢指针
- 二叉树 —— 递归思维、DFS/BFS
- 排序算法 —— 归并、快排及其应用
- 二分查找 —— 不只是在有序数组中找元素
第三阶段:进阶算法(3-4 周)
- BFS/DFS —— 图和树的遍历
- 回溯 —— 排列、组合、子集
- 动态规划 —— 最难也是最重要的专题
- 贪心 —— 局部最优到全局最优
第四阶段:专项突破(2-3 周)
- 图论 —— 拓扑排序、最短路径
- 堆 —— Top K 问题、合并 K 个链表
- 高频专题 —— 区间问题、字符串匹配等
复习策略:间隔重复
学了就忘是正常的。关键是有计划地复习。
艾宾浩斯复习法
做完一道题后,在以下时间点重做:
- 第 1 天后
- 第 3 天后
- 第 7 天后
- 第 14 天后
如果某次重做时卡住了,重置计时重新开始。
实操建议
- 用一个表格记录做过的题目和下次复习日期
- 复习时不看解析,独立重做
- 如果 5 分钟内能写出正确代码,说明已经掌握
- 重点复习做错过的和觉得难的题目
利用可视化加速理解
本系列教程的每篇文章都配有交互式算法可视化。推荐这样使用:
- 先看可视化:在读代码之前,先通过动画直观理解算法的执行过程
- 逐步跟踪:用播放器逐步前进,观察每一步数据结构的变化
- 对照代码:理解了执行过程后,再看代码实现,建立"代码 ↔ 动画"的映射
- 修改实验:尝试修改输入数据,观察算法行为的变化
看懂一个算法的执行过程,比背十遍代码更有效。
常见问题
"一天应该刷几道题?"
质量比数量重要。建议:
- 学习阶段:每天 2-3 道,认真理解和总结
- 冲刺阶段:每天 4-5 道,侧重限时训练
"做不出来怎么办?"
独立思考 15 分钟后看解析,然后关掉解析,自己重写一遍。第二天再独立重做一次。如果还是不会,说明前置知识有缺口,退回去补基础。
"Easy 太简单,Hard 太难"
这说明你需要聚焦 Medium。Easy 用来热身和验证基础,Hard 用来挑战和提升上限,但 Medium 才是面试的主战场。
"面试前多久开始准备?"
理想情况下 3 个月。如果时间紧,至少留 6 周,集中突破高频题型。
总结
- 不要盲目刷题,按技巧分类、系统学习
- 掌握通用框架,一个模板解决一类问题
- 重视复盘总结,做题笔记比刷题数量更重要
- 坚持间隔复习,对抗遗忘曲线
- 善用可视化工具,理解比记忆更持久
下一篇,我们进入第一个技术专题:复杂度分析。这是所有算法学习的起点。