Skip to content

如何高效刷题:框架思维 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。正确的做法是:

  1. 选一个专题(比如"滑动窗口")
  2. 先学通用框架和核心思路
  3. 做 5-8 道该专题的题目
  4. 总结变化规律,再进入下一个专题

第二步:每道题经历四个阶段

阶段时间做什么
审题5 分钟读清题意,识别问题类型,想到可能适用的框架
思考10 分钟独立思考解法,不要急着写代码
编码15 分钟写代码,运行测试
复盘10 分钟对照最优解,分析差距,记录心得

关键规则:如果思考 15 分钟完全没有头绪,就看提示或解析。不要死磕——在学习阶段,效率比自尊心更重要。

第三步:做题不是目的,总结才是

每做完一个专题,问自己三个问题:

  1. 这类题的通用框架是什么? 能否默写出来?
  2. 题目之间的差异在哪? 哪些地方需要微调?
  3. 常见的坑有哪些? 边界条件、特殊情况?

把答案写下来。这份笔记比刷题数量重要 10 倍。

推荐学习顺序

本系列教程的章节编排就是推荐的学习路径,按照由浅入深、前后依赖的逻辑设计:

第一阶段:打基础(1-2 周)

  1. 复杂度分析 —— 后续所有章节都需要分析复杂度
  2. 数组基础 —— 双指针、滑动窗口
  3. 哈希表 —— 最常用的辅助数据结构
  4. 栈与队列 —— 单调栈、BFS 的基础

第二阶段:核心技巧(3-4 周)

  1. 链表 —— 指针操作、快慢指针
  2. 二叉树 —— 递归思维、DFS/BFS
  3. 排序算法 —— 归并、快排及其应用
  4. 二分查找 —— 不只是在有序数组中找元素

第三阶段:进阶算法(3-4 周)

  1. BFS/DFS —— 图和树的遍历
  2. 回溯 —— 排列、组合、子集
  3. 动态规划 —— 最难也是最重要的专题
  4. 贪心 —— 局部最优到全局最优

第四阶段:专项突破(2-3 周)

  1. 图论 —— 拓扑排序、最短路径
  2. —— Top K 问题、合并 K 个链表
  3. 高频专题 —— 区间问题、字符串匹配等

复习策略:间隔重复

学了就忘是正常的。关键是有计划地复习

艾宾浩斯复习法

做完一道题后,在以下时间点重做:

  • 第 1 天后
  • 第 3 天后
  • 第 7 天后
  • 第 14 天后

如果某次重做时卡住了,重置计时重新开始。

实操建议

  • 用一个表格记录做过的题目和下次复习日期
  • 复习时不看解析,独立重做
  • 如果 5 分钟内能写出正确代码,说明已经掌握
  • 重点复习做错过的和觉得难的题目

利用可视化加速理解

本系列教程的每篇文章都配有交互式算法可视化。推荐这样使用:

  1. 先看可视化:在读代码之前,先通过动画直观理解算法的执行过程
  2. 逐步跟踪:用播放器逐步前进,观察每一步数据结构的变化
  3. 对照代码:理解了执行过程后,再看代码实现,建立"代码 ↔ 动画"的映射
  4. 修改实验:尝试修改输入数据,观察算法行为的变化

看懂一个算法的执行过程,比背十遍代码更有效。

常见问题

"一天应该刷几道题?"

质量比数量重要。建议:

  • 学习阶段:每天 2-3 道,认真理解和总结
  • 冲刺阶段:每天 4-5 道,侧重限时训练

"做不出来怎么办?"

独立思考 15 分钟后看解析,然后关掉解析,自己重写一遍。第二天再独立重做一次。如果还是不会,说明前置知识有缺口,退回去补基础。

"Easy 太简单,Hard 太难"

这说明你需要聚焦 Medium。Easy 用来热身和验证基础,Hard 用来挑战和提升上限,但 Medium 才是面试的主战场。

"面试前多久开始准备?"

理想情况下 3 个月。如果时间紧,至少留 6 周,集中突破高频题型。

总结

  • 不要盲目刷题,按技巧分类、系统学习
  • 掌握通用框架,一个模板解决一类问题
  • 重视复盘总结,做题笔记比刷题数量更重要
  • 坚持间隔复习,对抗遗忘曲线
  • 善用可视化工具,理解比记忆更持久

下一篇,我们进入第一个技术专题:复杂度分析。这是所有算法学习的起点。

延伸阅读

面试算法可视化图解