我一直觉得复习才是最见功底的学习环节。不少朋友喜欢猛刷题一天十几道结果过两周回头看连当时怎么AC的都忘了边界条件、状态转移、初始化细节全糊成一团。而真正能把知识留住的往往是那些愿意停下来做复盘的人。0x3f这个常亮在算法竞赛和编程里太经典了——memset 数组时用 0x3f3f3f3f表示无穷大、表示未访问、表示初始状态既方便比较又不容易溢出。我在第40天的复习里突然觉得这个常量像极了复习本身你得先把知识重置到一个清晰的初始状态再重新遍历一遍看哪些节点还没有被真正访问过、哪些边还是断的。这次复习记录是从 9:58 到 10:52差不多 54 分钟比一个标准番茄钟稍长一点。一开始我以为是临时起意坐下来才发现第40天恰好是学习曲线上的一个坎输入的新东西足够多了旧东西开始模糊如果再不系统过一遍后面只会越学越虚。所以这篇不讨论新算法、不追热点就把这一小时我怎么复习、复习什么、以及过程中踩到的坑完整拆开给同样走在长线学习路上的朋友做个参考。你不用照抄我的时间表但里面那些“为什么这么做”的思考应该能帮你把自己的复习流程也理顺。1. 为什么第40天要停下来专门复习先别急着打开题库。复习这件事最忌讳的就是“看起来努力”——翻开书觉得都懂动手一写全不会。我见过太多人栽在这一步包括我自己。第40天这个节点既不是开始时的鸡血期也不是临近考试的压力期它属于典型的“高原平台期”输入量已经积累到一定规模但转化率开始下降大脑对重复出现的内容产生习惯化反应简单说就是新东西学不进去了旧东西又开始遗忘。这时候停下来不是浪费反而是止损。1.1 复习不是重复是反遗忘德国心理学家艾宾浩斯那条遗忘曲线几乎所有学习者都听过刚学完的内容20分钟后只剩58%1天后剩33%6天后只剩25%。问题是很多人的应对方式是“多刷几遍”结果就是同样的题做了三遍每次都是从头硬想没有真正调用过记忆提取效果当然差。真正的复习应该是一种主动提取练习——合上书关掉题解凭记忆把思路写出来写不出来就是没掌握这时候再看答案印象才深。我这次复习的定位就是反遗忘不是“再看一遍”而是“默写一遍”。第40天之前积累的模板、套路、易错点已经有不少开始模糊了正好通过默写的方式把它们重新激活。默写的好处在于它逼着大脑做高强度检索这个过程本身就在加深神经连接比单纯阅读有效得多。1.2 0x3f 给我的启发初始化思维0x3f3f3f3f 这个值稍微接触过算法的人都知道等于 1061109567比 int 最大值小不少但两个它相加也不会溢出 int所以竞赛里常用它初始化 dist 数组表示无穷大配合 memset 按字节填充一条语句就能搞定。但这个常数背后其实藏着一个更普适的思维方式——初始化。任何问题第一步都是把状态设置好哪些是已知的起点哪些是未知的待探索哪些是无效的边界。复习也一样你得先给自己初始化一个清晰的“知识状态”而不是带着一团浆糊到处乱翻。回想一下你刷题时的经历一道题卡住了你往错误方向试了很多次后来发现是初始值赋错了。对吧算法里 90% 的诡异 bug 都出在初始化上。学习也一样知识体系的初始化做好了后面所有操作都顺初始化稀烂后面再怎么优化都别扭。所以我这次复习第一个动作不是做题而是先盘点自己的知识状态——哪些掌握牢固哪些已经遗忘哪些从来没真懂过。相当于给自己做一次 memset。2. 这54分钟复习我到底在复习什么时间有限不可能面面俱到。54分钟说长不长说短也不短但足够完成一轮高质量的知识梳理。我给自己定的原则是只复习三类东西——模板题、错题原因、套路串联。这三者分别对应“会不会写”“为什么错”“怎么更快”。2.1 模板题重写把“查过”变成“会写”所谓模板题就是那些解法已经高度套路化、几乎所有题都绕不开的基础题目比如最短路的 Dijkstra、最小生成树的 Kruskal、二分答案、背包 DP、线段树区间操作。这些模板的价值在于它们是上层复杂题的地基。地基如果还得现场想别说竞赛连日常笔试都做不利索。我的做法很简单不看书不查代码拿空白编辑器把它们一个个手写出来。写完之后再用测试数据跑一遍和标准模板对比差异。很多朋友会问模板背下来不就行了何必每次重写这里有个细节背模板是记忆重写是理解。当你从零手写 Dijkstra你才会被迫思考优先队列里该存什么、vis 数组的作用是什么、为什么 dist 初始化要用 0x3f3f3f3f 而不是 INT_MAX——这些理解是背代码永远得不到的。第40天这个节点我重点重写了三个模板Dijkstra、带权二分、以及单调栈。每个大概花7到8分钟。写的过程中我发现带权二分的边界条件我已经开始含糊了这正好说明复习的价值——如果今天不写后面做题用到时必然卡住。2.2 错题归因不是所有错误都是粗心第二个复习板块是看错题。我把过去两周做错的题翻出来不看题解先自己重新做一遍然后对每个错误做一个归类标注比如“边界处理漏了”“状态定义错了”“题目读漏条件了”“复杂度估计错了”。归因这一步非常关键因为只有知道错在哪类环节才能有针对性地训练。如果10个错误里有7个是边界问题你该练的是区间划分和极限数据测试而不是继续盲目刷新题。拿我自己来说最近错得最多的集中在二分的边界写法和 DP 的状态压缩上。尤其是二分l0、rn 还是 l0、rn-1不同题目写法完全不同一旦搞混就彻底跑偏。所以我不是简单把正确代码抄一遍而是自己推导了一遍“为什么这道题用左闭右开那道题用闭区间”把这个原理彻底掰扯清楚错题才有价值。2.3 套路盘点把常用技巧串成一张网第三件事是把之前做过的题按“套路”重新归置。比如“遇到区间最值先想单调队列/单调栈”“遇到图论最短路先想能不能分层”“遇到序列子段问题先想前缀和/前缀异或”。这些套路单独看都很简单但它们是解决新题时的思考起点。我会在纸上画一张思维导图但不是那种花里胡哨的彩色导图就是纯文字结构左边写题目类型右边写对应套路和常见变形中间用箭头连起来。画完你会发现很多看似不相关的题底层的套路是一样的只是穿了一件不同的题目外壳。这个串联过程能让你的知识从散点变成网遇到新题时定位速度会快非常多。3. 9:58-10:52 完整实操记录光说方法论没用我直接把这一个小时的时间切片给你看。9:58 开始10:52 结束一共54分钟。每个环节做什么、为什么这么做、中间出了什么问题我都会讲清楚。你可以把这个流程当模板根据自己的学习阶段调整。3.1 前10分钟画知识地图9:58 到 10:08这10分钟我拿来画知识地图。所谓知识地图就是不动手写代码先把目前已经学过的内容列成一张清单并对每一项做“状态标注”掌握得好的打绿模糊的打黄完全没概念的打红。你可能会说这个动作太简单了吧不就是列目录吗但真正做起来你会发现很多人连自己学过什么都说不全。我当时列出的板块有这些基础数据结构数组、链表、栈、队列、堆、树与图DFS、BFS、最短路、最小生成树、动态规划背包、区间、状态压缩、二分与贪心、数学与数论基础、字符串基础KMP、Trie。一边列一边回忆每个板块里的经典例题和核心代码结构能想起来就标记绿想起来但细节模糊就标记黄完全没印象就标记红。这一轮盘下来我大概确定了今天的复习重点黄区优先红区抽查绿区跳过。顺带说个细节我用手写笔记没用 app。原因是手写速度慢慢本身就是一种记忆强化。你在键盘上打字可以不过脑子但拿笔写的时候大脑需要同时调动记忆和运动系统信息留存率会高不少。当然如果你习惯用表格软件也完全可以关键是“列清单状态标注”这两个动作不能省。3.2 中间25分钟手写核心模板10:08 到 10:33这25分钟是重头戏我用来手写三个核心模板。为什么是三个因为学习心理学里有个概念叫“认知负荷”——同一时间塞太多东西大脑会直接宕机。25分钟写三个已经是上限再多就是走过场了。第一个写的是 Dijkstra。我特意不用优先队列优化那个经典写法而是先写朴素版本再写堆优化版本这样能逼自己回忆两者的复杂度差异以及 vis 数组在大数据量下是怎么影响性能的。写完粗测一下发现朴素版在稀疏图上多算了很多无用边效率比堆优化差了一倍多——这个体验比背十遍“堆优化更快”都有用。第二个写的是带权二分。这块写的时候卡了一下因为边界条件总是混淆。我干脆花了几分钟专门推导当判断函数返回的是单调布尔序列时要找最后一个真值和第一个假值对应的 l 和 r 更新方式是完全不同的。我把两种写法都列出来并用自己的话在旁边批注了一句“闭区间套模板别每次现推”。这样下次再写我先看题目是找左边界还是右边界再决定用模板。第三个是单调栈。我写了两个经典场景求每个元素左边第一个比它小的数、右边第一个比它大的数。写的时候特别标注了栈里存的是下标而不是值因为很多题需要借助下标计算区间宽度。这三个模板写完正好25分钟节奏刚好。3.3 最后15分钟综合题验证10:34 到 10:52最后这18分钟我拿来做一个“缝合题”练习——就是一道题里同时用到刚才复习的多个模板。为什么要这样收尾因为单独写模板只能证明你记住了代码但不能证明你能在真实场景里把它调度出来。只有遇到一道需要“先二分答案再跑 Dijkstra顺便用单调栈统计区间”的综合题你才会发现自己的知识点之间能不能顺畅连接。我选的那道题大概是给定一个无向图每条边有边权要求找一条从起点到终点的路径使得路径上最大边权尽量小。这个题的标准做法是二分答案连通性检测或用最小生成树性质但我特意试了试二分Dijkstra的写法把两个模板串起来用。过程中果然踩了一个小坑二分上界直接用了 INF结果跑出来不对后来才意识到应该用图中实际最大边权否则二分的单调区间太大白白多跑两轮。这个坑如果不做综合题单纯背模板是永远发现不了的。写到 10:52我把代码提交到题库AC 通过。那一刻的成就感其实不只来自题目更多是来自“我的模板真的能串起来用了”。从 9:58 到 10:52一小时不到但学习密度比很多刷题一上午的人都要高。4. 复习中的常见问题与排查复习过程不会一帆风顺我这次也遇到不少让人想摔键盘的时刻。下面这些问题我基本都经历过也总结出了一套排查思路希望对你有帮助。4.1 为什么看了很多题还是不会做这是被问得最多的问题。说白了就一句话看题和做题之间差着一个“试错”的过程。你看题解时大脑处于被动接收状态觉得每一步都很合理但轮到自己上手需要主动决策的地方全都暴露出来了——这一步为什么要这样转移那个边界为什么是小于等于只有亲手试错才能真正建立“决策感”。我的建议是复习时不光要看更要刻意设置“空白回想”环节。以二分为例不要一上来就看题解怎么写先自己回答三个问题这个题是找左边界还是右边界二分的判断函数怎么写跳出循环后 l 和 r 谁是正确的答案三个问题都答上来才叫掌握了。答不上来就说明你只是在“觉得懂了”不是真懂。4.2 复习计划总是被打断怎么办打工人和学生党都面临这个问题本来打算晚上复习一小时结果临时加需求、突然有饭局、孩子哭闹计划全乱。我见过很多人因为一次计划被打断就干脆放弃了整个复习计划这其实是最亏的。我的处理办法是“最小可执行单元”把每次复习压缩到15分钟。15分钟能干什么可以把今天学的模板默写一遍也可以把错题的归因卡片扫一遍甚至可以只画一张知识地图。关键是计划一旦缩小到15分钟几乎没有任何理由被打断。哪怕再忙睡前少刷15分钟短视频的时间总是有的。连续性一旦保住复习的惯性就不会断后面再慢慢把时间加回去也来得及。4.3 怎么判断一个知识点真的掌握了很多人复习了半天心里还是没底总觉得自己好像会了又好像不会。给你一个可检验的标准能不能给别人讲明白。所谓费曼学习法核心就是“用自己的话复述”。你尝试把“为什么 Dijkstra 不能处理负权边”讲给一个完全不懂算法的人听如果你能让他听懂说明你是真理解了如果你发现自己支支吾吾只能说出“因为负权会让已确定的最短路不再确定”这种结论但解释不了背后的松弛原理那抱歉你还没掌握。这个标准我每次复习都要自测一遍。比做对十道题都管用因为做题可能靠短期记忆和套路但讲出来一定是靠长期理解和逻辑梳理。5. 长线学习中复习频率怎么定最后想聊聊复习频率。不是所有人都需要每40天专门来一轮复习但每个人都需要一套自己的复习节奏。我的建议是分三层对应不同的时间尺度。第一层是日复习每天花15分钟过一遍当天学过的内容重点看模板和当天踩的坑。第二层是周复习每周抽一个小时把本周所有错题重新做一遍做对的和做错的各放一边错的进入下一轮重点。第三层是阶段复习就是像第40天这样的节点半个月或一个月一次重点是把知识地图重新画一遍看结构是否清晰、板块之间是否连上了。这三层的核心逻辑是“间隔重复”日复习防止短期遗忘周复习巩固中期记忆阶段复习整合长期体系。不一定非要严格卡天数但节奏感非常重要。你可以像我一样在复习卡片上记录每次复习的时间和内容一段时间后回看会非常直观地看到自己的成长轨迹。如果你正在经历学习的“高原期”别急着怀疑自己不适合这条路试着像0x3f那样把自己重新 memset 一遍把模糊的、错误的、遗漏的知识状态全部初始化再从清晰的状态开始重新探索。复习不是回炉而是为了走得更远。