
今天是我刷题打卡的第 43 天。早上 9:17 坐到书桌前10:29 合上笔记本中间大概 72 分钟全部用来做复习。这个习惯是从第 30 天左右养成的每刷满 7 天就固定抽一个早上不碰新题只回看旧题。很多人觉得复习是浪费时间但真正把我从“刷了忘、忘了刷”循环里捞出来的恰恰是这 90 分钟。我的复习主线基本围绕 0x3f 的题解和专题分类来走他在算法圈里常被喊作灵茶山艾府也是竞赛党熟知的0x3f3f3f3f无穷大初始化写法的常用来源。如果你也在长期刷题却感觉进步不明显这篇就是我第 43 天复习过程的全记录包括我为什么选复习而不是刷新题、90 分钟怎么排、以及踩过哪些坑才把复盘做成真正有用的动作。1. 为什么第 43 天我选择“复习”而不是“刷新题”1.1 前 40 天刷题后出现的记忆断层连续刷了 6 周我的题库里大概积累了 170 多道题LeetCode 上标记过的大概 120 道AtCoder 和洛谷上还有一些。看着数量不少但一个很尴尬的事实是如果有人第 43 天突然抽问我第 12 天做的题我大概率只能说出“这题好像是用双指针”但具体是先排序还是先移动右指针边界条件要怎么处理脑子里已经很模糊了。这不是记性差而是算法刷题的一个硬规律如果只做新题不做复习知识留存率会快速下降。按照常见的记忆衰减曲线一天之后能记住的内容就只剩 60% 到 70%一周之后可能只剩 30% 到 40%。我每天还在不停灌入新解法却没有给旧解法留出“重访”的时间遗忘就会被加速。这也是我从约第 20 天开始感到“做过的题突然又不会了”的原因。上周我试过临时翻两道旧题结果发现不仅思路要重新理连一些手熟的模板函数都要重新查。那一刻我意识到现在最缺的不是输入而是整理。与其继续赶进度刷新题不如把已经花过时间做过的东西重新沉淀一遍让“做过”变成“会了”。所以第 43 天的这 72 分钟我全留给了复习。1.2 复习的收益为什么比刷新题高先说一个反直觉的结论对一个已经积累了三四十天题量的人来说复习的性价比通常高于刷新题。原因很朴素。新题的难度是随机波动的状态好的时候 1 小时能啃下两三道状态差的时候一道题卡住一下午挫败感还特别强。而复习旧题的时候因为题目本身是自己写过的再次看到时大脑有“锚点”更容易把注意力集中在关键步骤上比如状态定义、边界条件、复杂度分析而不是从头开始阅读理解题意。另一个收益来自横向对比。0x3f 的题解最让我佩服的一点是他喜欢按专题归类把同一类型的题放在一起讲差异。复习最爽的时刻就是我发现“这道题和上周那道题其实是同一个模型只是换了一层外衣”。这种顿悟只能在横向复盘中出现单纯刷新题很难遇到。第三个收益是构建条件反射。算法竞赛和面试都有一个共同点时间有限看到题目要在几十秒内反应过来属于哪类问题。这种反应能力只能靠重复。我今天的复习目标之一就是训练这种“条件反射”看到关键词能快速定位到对应的算法套路。第 43 天上午的复盘完了以后我很确定这种做法远比盲目刷新题更能修正自己解题体系里的漏洞。2. 以 0x3f 分类体系为核心搭建复习目录2.1 先把做过的题按专题标签重新洗牌复习最忌讳的就是“打开题库从第一题开始看”。第 43 天起床后我做的第一件事不是刷题而是把过去 40 多天做过的所有题按专题标签重新洗牌在 OneNote 里建了一个临时总表。我把题分成了七个大类线性结构、前缀与差分、二分和排序、动态规划、图论、字符串、数学与位运算。每个类下面再细分比如动态规划下面拆成背包、线性 DP、区间 DP、状态压缩 DP 几个小块。这个分法参考了 0x3f 在力扣题解区常展示的分类思路他不喜欢把题简单按难度排列而是按算法模型归类。做完这个动作之后我发现自己过去 40 天的刷题结构偏得很厉害贪心题做了不少图论严重偏少线段树只碰过两三次状态压缩 DP 几乎没怎么练。这些偏科信息如果只看每日打卡记录是完全看不出来的。所以大家复习的时候第一步别急着看题先把仓库里的题按算法标签重新分配一遍你会立刻知道自己真正熟练的和真正欠缺的分别是什么。这里我放一个自己常用的标签对照表你可以直接用也可以按自己的题库调整专题大类细分方向我第 43 天复习时的自查状态线性结构数组、链表、栈、队列、双指针、滑动窗口滑动窗口较熟链表边界容易漏判前缀与差分一维前缀和、二维前缀和、差分数组一维前缀和稳定二维前缀和需要重刷二分与排序二分查找、二分答案、排序变体二分答案思路有边界写法不统一动态规划背包、线性 DP、区间 DP、状态压缩 DP背包模板熟状态压缩很不熟图论DFS、BFS、并查集、最短路、最小生成树DFS 会写最短路只会模板题字符串KMP、Trie、哈希哈希比较熟练KMP 只背过板子数学与位运算快速幂、GCD、组合数、位运算技巧快速幂能写按位 DP 不熟练这个表不需要做得特别华丽但一定要诚实。我第 43 天看到表格里“状态压缩 DP”那一栏几乎空白的时候心里其实咯噔一下但也正是这次洗牌让我确定了接下来两个周期的主攻方向。2.2 为什么按专题复习比按时间顺序复习有效很多人复习喜欢“往回翻”从第 1 天开始一天一天往后看。我第 43 天的亲测体验是按时间顺序复习会让人非常难受。原因是每天的打卡内容本身就是杂的今天数组明天 DP后天构图大脑在切换上下文的时候会额外消耗大量精力半天下来只觉得自己好像都看过又好像什么都没抓住。按专题复习的本质是把“零散的知识点”重组成“可迁移的套路”。用个生活里的例子你整理衣橱的时候如果按“周一穿什么、周二穿什么”来整理换季时会很痛苦按“上衣、裤子、裙子、外套”分类拿取效率就高很多。算法题也是一样DP 题放一起复习你会隐隐发现它们的状态定义其实都在回答同一个问题这题有什么东西需要被记住而图论题放一起复习你会注意到大部分问题都在做同一件事把现实关系抽象成点与边。0x3f 的题解风格里有一句我印象很深的话大意是“框架不重要重要的是同类问题之间共同的结构”。这次复习我深有体会。当我把 5 道区间 DP 题放在一起重看时它们看起来一个是最少插入次数一个是戳气球一个是矩阵链乘但剥掉场景后底层的枚举顺序、区间长度递增的枚举方式几乎一模一样。这种发现单靠“每天刷一道新题”是永远等不来的。3. 从 9:17 到 10:29一次 72 分钟复习的完整拆解3.1 前 8 分钟准备阶段先把复习材料摊开坐下来第一件事不是马上翻题解而是先准备好材料。9:17 到 9:25 这 8 分钟里我打开了三样东西自己的打卡记录表、力扣收藏夹里的题列表、以及一个专门用来记“卡壳点”的备忘录。这三个东西的分工很清楚。打卡记录表告诉我“做过哪些题”收藏夹告诉我“哪些题值得二刷”卡壳点备忘录则是我过去一周做题时顺手记下的疑问。比如上周我在做一道二维前缀和的题时代码跑了半天才发现某个坐标加一减一搞混了这种临场踩坑如果不记下来一道题刷完就等于真的刷完了没有留下任何可复用的教训。材料摊开后我会在今天要复习的专题里挑出约 10 道题出来标上序号。这 10 道题不是随意选的而是遵循两个标准一类是当时做的时候觉得很绕、想了很久的题另一类是虽然 AC 了但我很确定自己是“照板子写的”没有真正理解。这种题的典型特点是如果换一个题目背景我可能不会想到要用这个写法。把它们挑出来集中处理复习效率远高于把已经熟练掌握的题重复看一遍。3.2 中间 25 分钟快速过题不看题解只想思路9:25 到 9:50这 25 分钟是整场复习的核心环节。我给自己定的规则很简单对那 10 道题只看题目描述和我的历史代码片段不看题解不跑代码每道题最多花 2 到 3 分钟在纸上写出“这题应该用什么算法、状态是什么、循环顺序是什么”写不出来标个小红旗。这里有个细节值得强调想思路的时候不要写完整代码只写三句话。第一句是“用什么算法”第二句是“核心数据结构”第三句是“最关键的边界条件”。为什么要限定得这么死因为完整代码会让人产生“我会做”的错觉而只写骨架能暴露出真正的思路空白点。比如今天复习到一道使用栈的题我本以为只要用单调栈维护一个序列就行但写到第三句“什么时候弹栈、什么时候更新答案”的时候卡住了只得回头翻我当时的代码才发现原来弹栈条件是nums[i] stack.top()而我脑补成了。这个细微差别直接导致覆盖不了相等元素的情况如果只当场上去写完整代码我大概率会自信满满地写错。第 43 天的这 25 分钟里10 道题我标了三面小红旗这个比例让我又惊又喜惊的是自己竟然有这么多漏洞喜的是这些漏洞今天不抓出来后面迟早要炸。3.3 接着 20 分钟挑两题重新手推把漏洞补上9:50 到 10:10这 20 分钟是用来“亲自下场”的。小红旗标了三种题我从中挑两题出来手推为什么只挑两题因为一次复习的时间有限贪多嚼不烂。既然我明确知道这三道题是薄弱的那我宁可只重做两道把过程真正理顺也好过三题都只做半吊子。我选的是刚才提到的那道单调栈题另一道是 0-1 背包的变体题。先看单调栈这次我没有翻历史代码而是从单调栈的核心性质开始推理栈中的元素是递增还是递减每个元素从入栈到出栈的这段时间里这个题目到底需要用它来结算什么把这两点想明白之后我手写了一个新版本的框架放到编辑器里大致长这样def next_greater(nums): stack [] ans [-1] * len(nums) for i, x in enumerate(nums): while stack and nums[stack[-1]] x: idx stack.pop() ans[idx] x stack.append(i) return ans写完之后我发现和原来的写法一对比真正需要记住的不是“while stack”这种模板而是nums[stack[-1]] x这一行的等号要不要取。如果题目要求严格大于那就是如果不是严格那就得改成。这个细节在 0x3f 的题解里经常作为一个提示点出现现在我算是亲手验证了一次。对于那道 0-1 背包变体我直接在纸上写出了状态转移的核心步骤重点检查了dp数组的遍历方向为什么从大到小。以前我就是死记硬背“从大到小”今天把“避免覆盖上一层状态”这句话和自己手推的例子对照了一遍才算真正把这个知识点从“背下来的”变成了“能解释的”。很多算法初学者总觉得看懂了就等于会了但看懂的标准其实是你可以不讲给别人的情况下自己在纸上无参考地把关键步骤推出来。3.4 最后 15 分钟对照 0x3f 题解复盘并记录结论10:10 到 10:25我开始对照参考题解过一遍今天复习的几道题。我不把 0x3f 的题解当成唯一的标准答案但我会重点看他每个状态定义是怎么写的、边界条件是怎么处理的、代码风格上有没有值得我学习的整理方式。这里分享一个对我帮助非常大的习惯读题解的时候不只看他的代码比我短多少而是看他的思考顺序。比如有些题他会先写一个最朴素的版本再优化成一版时间复杂度更好的这种“递进式”解答特别适合复习用。因为复习最需要关注的就是“最优解是怎么一步步长出来的”而不是只盯着最优解这一张皮。10:25 到 10:29我在打卡表上补上了今天复习的结论大概写了四行今天重点复习了单调栈和背包已确认会写且能解释的两道还有一道哈希题虽然能 AC但当时用的方法不是最优标记为待优化二刷目标锁定为图论里的最短路问题下次复习日期定在第 50 天。整个过程结束后我看了一眼时间10:29正好 72 分钟不多不少。4. 复习过程中必须绕开的四个坑4.1 坑一把复习做成了重新看一遍答案我第 35 天第一次尝试复习的时候很认真地犯过这个错误。打开一道做过的题看到熟悉的代码心里特别爽感觉“这题我会”五分钟之后下一道又感觉“这题我也记得”。一个多小时过去自我感觉极其良好然后过了两天做同类型的新题原形毕露还是一样卡。后来我复盘原因才明白看答案产生的“熟悉感”是一种典型的认知偏差。你以为自己理解了其实只是眼睛认识了。第 43 天的复习里我给自己定下了一个特别严格的要求任何一道题必须先默想算法框架和关键边界思路卡住了才能看自己的历史代码历史代码也解决不了问题才允许看题解。顺序一旦变成“看题解-点头-翻下一篇”整场复习的价值就归零了。这也是我不建议复习时用那种带“展开答案”模式的刷题软件的原因太容易把复习变成翻阅。4.2 坑二贪多试图一个早上过完所有专题这条路我走过一次在第 28 天的时候我雄心勃勃地计划一个早晨把 DP、图论、字符串、数学全过一遍。结果呢每个专题只看了十几分钟思路刚要热起来就切下一个最后哪个都没吃透还因为节奏太赶产生了强烈的挫败感。算法复习的本质是“深度重访”不是“广度浏览”。一次复习能深入一个到两个专题就已经很不容易了因为每个专题里至少有四五道题需要你重新调用大脑里的思路、检查错误、手推边界。指望一小时把七个方面的知识全过完听起来很高效实际上像拿着花洒冲一片地看着到处都湿了其实全都没浇透。我今天的复习范围严格限制在“单调栈背包”范围小了每一步也就扎实了。4.3 坑三只复习简单题回避难啃的硬骨头人的天性就是喜欢做简单题因为能带来即时正反馈。我也一样翻开旧题列表最想先看的是那些秒过签到题。但复习的价值恰恰在那些你过去做起来很费劲的题目上。那些题目当时可能靠着题解或者看了很久才懂也最容易在 7 天后被忘得一干二净。我现在选复习对象有一个固定的原则挑当时耗时长、代码多、边界条件绕的题。比如第 43 天我特意挑了一道当时卡了快一个小时的二维前缀和题目。这道题当时虽然 AC 了但我知道自己写得很侥幸。复习时我第一眼就能察觉到一个隐蔽错误求某个矩形区域和的时候坐标偏移导致结果差了整整一行。不去碰这种题复习就是纯粹的自我安慰。4.4 坑四复习完不留下任何记录如果复习结束只是“心里有数”那这个数大概率会在一周内再次蒸发。我第 43 天复习后做的第一件事是在打卡表里新增了一个选项卡专门记录“复习日志”。每一行至少包含三个字段日期、复习专题、下次需要重点回看的问题。这个方法救过我很多次。比如今天记录的“二维前缀和坐标偏移容易出错”下次复习的时候我就能直接定位到这个问题而不是把整道题重新看一遍。记录的另一个意义在于它让复习形成闭环第 43 天发现的问题第 50 天去验证有没有真正解决如果已经解决就把它从重点清单里划掉。这种看得见的进度才是长期复习能坚持下去的真正驱动力。5. 回顾与后续第 43 天复习给我留下了什么5.1 一道题因为复习被临时从放弃列表里救了回来今天早上做题的时候有一道题我差点就要永久放弃了是一道涉及状态压缩的 DP 题。第 41 天我第一次做的时候看题解都看得头大后来直接把题丢进“待看心情再说吧”的收藏夹。今天整理专题标签的时候我把它夹在状态压缩 DP 那一组里刚好旁边有一道当时做得还行的普通状压题两者一对比我突然发现这个难题只是多了一个处理“状态合法性”的步骤核心的状态定义和我熟悉的那题是一样的。换在以前这种题我可能永远也不会再去碰因为每次看到它都会想起当时卡住的无助感。但把它放进专题复习的语境里它的难度瞬间被拆成了已知的组件。这是我第 43 天最大的一次收获不在于多学了一个知识点而在于我知道了一个方法把难题放进同类型的包围圈里它的防线会被撕开一个口子。5.2 未来两轮打卡的具体调整计划这次复习之后我给后续刷题计划定了一个很明确的调整方案不一定适合所有人但对“刷了一段时间但感觉不扎实”的人应该有参考价值。第一把每周第 7 天固定设为复习日不允许用来开新题。这个计划的要义不是“多学”而是“防遗忘”。第二复习时同时只针对一到两个专题宁可反复看同一批题也不要雨露均沾。第三将每日刷题记录里的“复盘备注”从原来的可选项改成必填项哪怕只写一句话比如“这题的坑点是负数取模”也强迫自己留下痕迹。第四每 30 天安排一次大复盘把之前 4 个复习日的笔记集中过一遍重点检验那些所谓的“待优化”和“待重看”的题有没有真正变成熟手题。5.3 今天复习完的一些真实体会写到这里已经过了中午。我今天没有刷出一道新题打卡表上的题号数量没有增加但奇怪的是我很确定自己的进步一点也没少。复习最大的魔力在于它把“以前好像做过”变成“现在我知道为什么”。这种从模糊到清晰的变化不像刷新题那么有存在感但它才是真正能陪你走进考场、走进面试现场的东西。如果你目前也在坚持刷题打卡我强烈建议你从下一个周期开始拿出一到两天做一次专题复习不要急着往前冲。第 43 天的这一个多小时是我最近做得最值的一次“不刷新题”。