刷了三百多道题面试却被一道中等难度的二叉搜索树题问住——这是我刚开始准备算法面试时最真实的状态。后来我把LeetCode收藏夹删了个干净开始跟着代码随想录按专题系统刷题才真正摸到算法面试的命门。今天要聊的就是我自己整理并持续更新的这套《代码随想录 算法笔记》版本号刚推到26.3。如果你准备笔试面试、准备转码或者只是想系统梳理一遍常见算法模型这套笔记可以当成主线条来用。它和网上散落的题解最大的区别是不靠题目数量堆砌靠顺序和框架取胜。我把这份笔记当成自己的第二大脑在用——每个专题先讲清楚底层逻辑再安排经典题目最后留出思考和复盘位。适合每天能挤出1到2小时、愿意把一道题吃透而不是刷十道题混个脸熟的读者。下面我把笔记的结构、使用方法和踩过的坑一次说清楚。1. 代码随想录到底解决了刷题人哪个核心痛点1.1 它的本质是一张有顺序的算法地图先说结论代码随想录不是题库是一张从零开始的算法学习路线图。作者外号Carl整个系列按照“数组 - 链表 - 哈希表 - 字符串 - 双指针 - 栈与队列 - 二叉树 - 回溯 - 贪心 - 动态规划 - 图论”这条主线展开每一章都有配套题单和详细题解。GitHub上的仓库叫leetcode-master和配套网站同步更新。我自己最认可的一点是它对每个专题都做了“先理解再做题”的安排。比如动态规划章节不是上来就甩一堆背包问题而是先用几道最基础的斐波那契、爬楼梯题把“状态定义、递推公式、初始化、遍历顺序”这四板斧讲清楚然后再逐步展开到01背包、完全背包、打家劫舍、股票买卖这些经典模型。很多人刷题失败根本不是智商问题是方向问题。今天做一道链表题明天做一道图论题后天又跳回数组每个知识点都是浅尝辄止形不成体系。代码随想录的价值恰恰就是把散落的算法知识点串成一条有依赖关系的链。数组和链表是基础结构二叉树是递归的练兵场回溯和贪心在二叉树基础之上延伸动态规划又是一套完全不同的思维方式。顺着这条链走下去每一步都知道自己在哪、下一步要去哪。1.2 和主流刷题资源相比它赢在哪些细节上为了说清楚我拿几个常见的刷题资源做个对比对比维度代码随想录LeetCode热题100算法导论众多B站刷题视频刷题顺序按专题旧固递进依赖前置知识按通过率/热度排序顺序随机按理论体系纯学术向多数按Tag分集集间无衔接复杂度分析每道题都有时间/空间复杂度拆解部分有官方复杂度说明深入但偏数学讲不清楚的现象很常见动态规划讲解从零搭建四步法模型归类清楚题解零散同质题多原理强缺少实操映射良莠不齐图论覆盖明确补全了岛屿、最短路、并查集、最小生成树等专题基本只有少量题很全面但和面试脱节要看具体老师持续更新版本号肉眼可见在推进新题持续补入官方静态版本固定看作者心情这个表不是我硬凑的是我把笔记做到26.3之后对各类资源做过的梳理。代码随想录最难得的不是题目数量和视频质量而是它在“算法学习顺序”这件事上下了功夫。就拿图论来说很多前端转码或者科班出身但平时不刷题的人遇到岛屿类问题、并查集、Dijkstra经常整段垮掉。原因是大学课程里图论偏理论面试里却总考应用中间缺了一条衔接的桥。代码随想录这两年专门把图论相关的题目补齐了这部分在别的开源题单里很少见。1.3 哪些人最适合拿它做主线根据我自己带人刷题的经验有三类人和这套笔记磨合得最好第一类是零基础转码的人。编程基础薄弱但时间预算相对充足可以从数组、链表慢慢爬每天两三道三个月就能覆盖八成面试常见题型。第二类是科班但算法课学得干瘪的学生。他们听得懂图论的顶点边概念但没做过几道题代码随想录能帮他们把课堂理论和面试实战接起来。第三类是面试时间已经比较紧的求职者。这类人不需要把笔记全刷完按我的经验只刷每个专题前三分之一的经典题配合每章的总结部分两周内也能建立一个还过得去的框架。反过来说我也见过谁不适合目标是冲刺顶尖公司ACM难度题的人。代码随想录覆盖的是面试高频算法模型遇到偏竞赛性质的构造题、数学味极重的计数题它并不是主攻方向。这时候你需要的是Codeforces题单或者更专业的竞赛训练这不矛盾选择适合自己的材料本身就是一种能力。2. 定制专属刷题顺序我复现出来的“主线 支线”打法2.1 为什么不能按题目难度刷而要按专题依赖刷很多人打开LeetCode之后的第一反应是先刷简单题再刷中等题最后碰难题。这个思路听起来稳妥但实际上效率很低原因在于它割裂了题目之间的知识关联。举个例子二叉树的层序遍历在LeetCode上属于中等题它依赖队列这个基础数据结构。如果你按难度刷先刷了Easy的数组题、字符串题再去做层序遍历很可能卡在“队列存节点一层一取”这个思路上绕不出来。代码随想录的处理方式是把层序遍历放在“栈与队列”专题的末尾前面先用有效括号、逆波兰表达式、滑动窗口最大值这些题把栈和队列的脾气摸透再碰层序遍历就顺理成章了。我记录一下自己复现这份笔记时最主要的顺序原则先搞定线性结构数组、链表、哈希表、字符串再进入树形结构二叉树最后进入复杂的算法范式回溯、动态规划、图论。“贪心”实际上夹在中间代码随想录对贪心的定位是“没有固定套路但是有大量经典场景”——先用局部最优推出全局最优的直觉练起来之后到了动态规划里“贪心可行但DP才是通法”的价值判断时才不会一脸懵。2.2 笔记里每条主线的打开方式我把自己每轮刷题时的主线规划写成这样一张表你可以直接抄走用主线阶段专题范围目标产物里程碑标准第一阶段数组链表哈希表双指针、虚拟头节点、哈希计数手感能独立写出环形链表入口、三数之和第二阶段字符串栈与队列KMP、栈模拟、单调队列思想能说出KMP的next数组为什么这么设计第三阶段二叉树全家桶递归三步曲的肌肉记忆前中后序层序BST增删查全部独立通关第四阶段回溯贪心树形问题抽象能力能画回溯树、写出排列组合问题模板第五阶段动态规划专题状态转移四板斧背包、打家劫舍、买卖股票能归类对应模型第六阶段图论补充岛屿、最短路、并查集能在45分钟内完成“岛屿数量被围绕的区域克隆图”组合这条线最核心的一个思路是每完成一个阶段你会得到一件趁手的“武器”。第一阶段结束你拥有了双指针的敏感度第三阶段结束你对递归的恐惧会明显下降第五阶段结束后你再看绝大多数Medium动态规划题脑子里第一反应不是“我不会”而是“这属于哪个模型”。2.3 26.3版本更新的内容哪些值得单独刷一遍我这个版本的笔记是在26.2基础上迭代的。整体变化有三个方向第一新增了最近一年大厂笔试里高频出现的新题比如涉及双向链表手写的工程设计题、依赖拓扑排序的前后置任务调度题第二动态规划板块把“买卖股票”系列从单个模型重构成了一个带状态机的小节用统一的状态定义把冷冻期、手续费这些变体串在了一起第三图论部分补了两个专题并查集在冗余连接问题中的应用以及多源BFS解决01矩阵这类问题的方法。这些更新集中反映了算法面试的一个趋势纯模板题比重下降把算法套进场景里的综合题变多了。所以26.3版本里我刻意在每题旁边标了“模板题”“变体题”“综合题”三类标签。二刷的时候优先吃透模板题变体题用来检验对模板的迁移能力综合题放到周末状态最好的时候集中攻。3. 拿到一份现成笔记之后怎么把它变成自己的东西3.1 三个月的完整刷题排期精确到每周目标工具再好没有执行计划依然是零。这是一份经过我和几个朋友实测的三个月计划每天只需投入1.5小时左右时间阶段每周主题刷题数量复盘要求第1-2周数组、链表20道每道题手写复杂度分析第3周哈希表、字符串15道KMP算法能脱稿推导next数组第4周栈与队列、双指针15道每个模板整理成一段话第5-6周二叉树25道递归三步曲每道题都写注释第7周回溯12道画满三张回溯树图第8周贪心10道归类比“贪心失效”的题第9-11周动态规划25道四步法写到每一题的题解首行第12周图论与综合复习15道重刷第一周的错题这里有几点要注意。一是每天新题控制在2到3道再多就是走马观花。二是每周日固定留出两小时做“错题重刷”目标是那些第一次没想出来、看了题解才明白的题。三是不要把刷题数量当作进度指标把“能不看题解写出来”当作进度指标。3.2 做题五步法不是把代码跑通就完事我把自己在笔记里长期使用的做题流程固定成了五步每次做题都走完这一遍审题与抽象在纸上先写下题目给了什么输入、要求什么输出把题面从人话翻译成算法语言比如“求最大连续子数组和”等于“在数组上维护一个动态状态”。暴力解先行先把能跑的暴力版本写出来跑通之后再思考优化。暴力解不丢人它是你理解题意的证明。推导复杂度每一版方案都要标出时间和空间复杂度不标不算做完。对照笔记找差距做完后翻开代码随想录对应章节看Carl的写法好在哪里。重点观察三点——循环不变量是否清楚、边界条件怎么处理、状态定义是否清晰。当晚写三行总结在笔记对应题目旁边写三行第一行是这题的核心考点第二行是我卡住的原因第三行是下次遇到同类题的触发条件。这套流程看起来繁琐但真正坚持下来之后你会发现二刷三刷的速度快得惊人。因为一刷时候的三行总结直接成了二刷的导航。3.3 笔记整理的两个习惯错题标记和思路索引我的笔记不是抄题解而是每道题形成一个“个人档案”包括状态标记、自我思路复盘、判定性信息。状态标记用五档制已AC一次过、已AC但耗时久、看了提示才过、看了题解才过、完全没思路。对后两档的题每周必须重做一遍直到升级为前两档。思路索引是另一个好东西。我在笔记最后面维护了一个“场景 - 算法 - 复杂度 - 模板代码”四层映射表。比如遇到“图中两节点是否存在路径”这个场景索引指向并查集遇到“有向图是否存在环”的题索引指向拓扑排序遇到“最长连续递增序列”但要求O(n)索引指向贪心或者滑动窗口。时间越长这个索引越厚到了面试前突击阶段它比任何别人整理的速查表都好用因为每条映射都是你自己推理出来的。4. 一座大坑为什么很多人刷完一遍笔记还是心里发虚4.1 误区一把“看懂题解”误当成“掌握题目”这是刷题圈子里第一大幻觉。我见过不少人看题解时每个字都认识尤其代码随想录的题解写得清楚看完觉得都会但合上书自己写就卡住。这种情况的本质原因是题解是别人思维的产物你看懂的是“别人为什么这么想”而不是“我自己该怎么想”。破解方法只有一个看完题解后一定要关掉它从空白的编辑器和稿纸开始独立把代码完整写出来。写不出来的地方不用死磕回头再看一眼题解里对应的位置然后再次闭卷重写。每道题重复这个循环两到三次你的身体才开始形成条件反射。我把这个要求直接写进了笔记的使用说明第一页一道题只有能够连续两天闭卷AC才算正式“入库”。4.2 误区二模板背了一堆却不知道模板的边界条件代码随想录有很多总结性质的模板比如二叉树的递归三步、回溯算法的组合问题模板、动态规划的DP数组定义。模板本身是好的但我见过有人把回溯模板背得滚瓜烂熟结果碰到“子集II去重”就翻车反复WA在重复子集过滤上。这就是典型的只记住了模板忽略了模板背后的两个关键参数去重的排序时机和used数组的剪枝逻辑。要规避这种问题我在每个模板之后的复盘位上都会写清三个边界模板适用的输入范围、模板失效的触发条件、模板的复杂度上限。比如回溯模板适用场景是决策树模型失效触发条件是“子集包含元素顺序无关”复杂度上限是O(2的n次方)量级遇到n大于20时基本只能考虑贪心或DP。把这三条刻进脑子里才算真正理解了模板而不是只能对着模板抄。4.3 误区三只刷新题从不重刷旧题人类对算法的记忆衰减速度超乎想象。一份我三周前AC过的题如果不刻意复习再拿出来大概率只能回忆起大方向细节已经模糊。代码随想录的题单足够长很多人会陷入一种“刷到后面忘前面”的泥潭越刷越慌。我的应对策略是建立滚动复习机制每周六固定只做本周错题和上周的“看了题解才过”标记题。每月最后一个周末做一次全量错题清点把连续一个月的错题重新刷一遍。这套机制看起来占用时间实际上它才是让刷题产生复利的关键。没有复习的刷题相当于往漏水的桶里灌水只有复习才能把桶底补上。5. 面试前一周怎么用这份笔记做速通5.1 建立只属于你的“考前速查清单”面试前一周不要再看新题这时候收益最大的是把笔记里所有二刷三刷的标记题和思路索引完整过一遍。我个人会把考前清单分为三个模块语言与基础结构模块数组遍历的边界写法、链表虚拟头节点、哈希表解决“是否出现过”、字符串的KMP模板每个结构要求能在5分钟内默写一道代表题。算法范式模块二叉树递归三步、回溯模板去重细节、动态规划四步法背包模型分类、并查集的查与并。易错细节模块数组越界条件、递归终止条件的返回值、二维数组在DP里的初始化顺序、图论里visited数组的位置。这份清单不需要太长但必须是从你自己的笔记里萃取出来的。别人整理的速查表只能给你大概方向你自己的清单才真正对应你的薄弱点。5.2 现场面试时怎么调用笔记里积累的框架面试时写题和平时刷题最大的不同是有时间压力和对话压力。我的经验是拿到一道题后不要急着上手写代码先用笔记本里积累的“场景映射”把题目归类。比如看到“求子数组”“求子序列”的题先判断是连续还是不连续连续大概率是滑动窗口或前缀和不连续大概率是动态规划或双端序列处理。看到“树”字先画递归树再判断是遍历还是搜索搜索密切注意回溯。看到“图”字先问自己是连通性、最短路径还是拓扑关系对应并查集、Dijkstra家族还是拓扑排序。归完类之后再和面试官口头确认思路。如果面试官提示你“这只是中间状态还要继续优化”那就依据笔记里模板复杂度上限的知识来判断该往哪个方向升级。比如一道哈希表能解决的题被要求O(n log n)你就知道该转向排序了如果一道贪心被质疑正确性你就要考虑用动态规划做完整证明。5.3 面试之后的笔记归档才是下一轮进步的起点每场面试结束不管结果好坏都要把面试中写过的题第一时间补进笔记并打上“面试实战”标签。这不是为了下一次面试直接偷题而是因为面试场景会暴露平时刷题注意不到的盲点在某些边缘case上你容易慌、在某种表述下你会误解题意、在某个数据结构上你的实现不够干脆。我在26.3版本里特意加了这个“面试实战”栏目把所有真实场景里卡住的题单独归档配上现场思考和后续修正。说实话这份笔记刚完成的26.3版本对我来说更像是一本成长记录。最值钱的不是那些来自公开题解的内容而是这些带着现场体温的记录。算法这条路没有捷径但有了清晰的路线图和滚动复盘机制普通人也能走得从容。希望这份笔记的整理思路能帮你少走一点我当年弯路的距离。