很多想学算法的人,其实不是不努力,而是努力的方向和方式出了问题。收藏夹里躺了一堆教学视频、买了三四本经典书、每天刷两道题,结果一个月过去,遇到新题还是没思路,看过的解法很快就忘。问题不在于智商,也不在于刷题数量,而在于知识没有真正“过脑”。我最近一直在实践一种以“10分钟过脑课”为核心的算法学习路线,效果不错。它的核心思路不是让你在10分钟内学会一个算法,而是用10分钟的时间把算法最重要的骨架、典型场景和易错点,用一种强制性回忆的方式刻进脑子里。这篇文章把这条路线完整总结出来,内含路线的设计逻辑、具体的10分钟分段使用方法,以及我实践过程中踩过的坑和总结的排查方法,希望能帮你摆脱“看会了但做不会”的循环。
1. 路线设计思路:为什么算法学习需要“过脑”而不是“过眼”
1.1 “看懂了”是最大的错觉
我见过太多学习者,包括几年前的我自己,在学算法时都陷入同一个怪圈:视频看懂了,书看懂了,专栏文章也看懂了,但合上屏幕自己动手写,写了半天还是写不出来。这种“看懂”本质上是视觉和逻辑上的跟随,而不是认知上的内化。
举例来说,看动态规划的教学视频时,讲师在讲状态转移方程怎么推、表格怎么填。因为思路是连贯的,每一步都合理,你自然觉得“我懂了”。但实际上,你的大脑只是跟着讲师的思路线性走了一遍,并没有形成自己的路径。一旦遇到一个变体,比如背包问题换了个约束条件,脑子里那根勉强接好的线就断了。
所以算法的学习关键不是“多看几遍”,而是“主动回忆”。10分钟过脑课一开始设计时,锚定的核心就是主动回忆机制。所谓过脑,就是在看完一个算法的基本材料后,不依赖任何提示,自己把这个算法的使用前提、操作步骤、复杂度、边界条件、能解决的问题类型全部叙述出来。这个过程才是真正让神经元之间建立强连接的时机。
1.2 为什么是10分钟而不是1小时
有人可能会问,为什么是10分钟,时间这么短能学什么?这里有个常被忽视的事实:人的注意力持续聚焦在有意识学习上的时间窗口,往往只有二十分钟左右,而10分钟的颗粒度恰好适合一个相对完整的“输入-巩固-输出”循环。
10分钟这个窗口的优势还在于它极容易嵌入日程。无论你是学生、上班族还是准备面试的人,一天里抽出两三个10分钟空格远比抽出整块1小时容易得多。我实践的路线里,一天安排两到三轮10分钟过脑,一轮用来学新算法的骨架,另一轮用来复盘旧算法的细节,每轮时间都不长,但收益却很确定。
更重要的是,10分钟能强迫你决定哪些信息是关键的。一个算法动辄几十行实现、多种变体,如果给你一小时,你会眉毛胡子一把抓。但如果你只有10分钟,你必须逼自己提炼出最核心的几个要素:这是什么问题模型?标准解法用什么数据结构?时间空间复杂度大概是多少?边界值要注意什么?
这套筛选信息的过程,就是过脑的过程。
1.3 过脑课的完整学习闭环
我的路线里,每个算法的学习周期由四步组成,正好能嵌入多个10分钟窗口:
第一步,原理解析(10分钟):读一篇文章、看一段带讲解的代码或者听一小节课程,理解核心思想,重点是搞清楚“为什么这么做”而不仅是“怎么做”。
第二步,主动输出(10分钟):关掉所有材料,用自己的话、画图、伪代码,把这个算法推导出来。这步是整个路线成败的关键。如果推不出来,宁可再花一个10分钟重新看材料,也不要直接看答案糊弄过去。
第三步,手写实现(10分钟):在编辑器里裸写代码,不查API、不翻笔记。从函数签名开始,到循环终止条件,到返回值的处理,全凭记忆和推导完成。
第四步,变体对照(10分钟):拿两道该算法的经典变体题,用同一个核心算法去套,看哪里套得上、哪里套不上、需要加什么条件。
等于说,一个算法完整过脑需要四轮10分钟,但每轮之间间隔几个小时到一天,而不是连续40分钟。间隔本身就是记忆巩固的催化剂,这比连续刷一小时效果好得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 学习路线的阶段拆解:从零基础到专项突破
2.1 阶段一:先建立算法思维框架而不是先刷题
很多学习路线把数据结构排在算法前面,分成两大块拼在一起。我的路线不太一样,我建议先用几个迭代,把“算法到底是怎么一层层解决问题的”这个框架刻进脑子,再慢慢往框架里填具体的算法。
这个阶段的目标是理解五大通用问题模型:穷举与枚举、分而治之、回溯与搜索、动态规划、贪心近似。不需要学细节,只需要知道每个模型解决什么问题、典型复杂度量级、核心代价在哪里。比如看到一个问题,先判断它是不是穷举可解,是否具备贪心的局部最优性质,是否可能存在重叠子问题,这就比一上来就背代码重要得多。
在这个阶段,10分钟过脑课的任务很单纯:每天选一个问题模型,找一道经典题,只看题解思路文字,然后闭卷回答三个问题——这个模型的核心假设是什么?不满足这个假设会发生什么?换一个模型可能怎么做?
我强烈建议在纸上画这个框架,用一张A4纸把五种模型画成五边形,边上记典型问题和关键条件。这张纸整理好后,后续所有学习的算法都可以归位到这张图的某个分支下,形成树状索引,而不是零散的知识孤岛。
2.2 阶段二:按题型主线吃透核心高频算法
第二个阶段我称之为“主线算法攻坚”,目标是覆盖面试和实际项目中最高频的二十个左右算法。这里不是罗列所有算法,而是按题型主线逐个击破。
我推荐的主线顺序是:数组与链表操作、双指针与滑动窗口、二分搜索及其变体、单调栈与单调队列、哈希表典型套路、二叉树遍历与递归、树形结构的高级操作、图的搜索(BFS/DFS)、最短路径与最小生成树、拓扑排序、并查集、动态规划的常见模板(背包、序列、区间、树形)、贪心经典案例,以及字符串处理里的KMP和字典树。
这里最忌讳的就是“蜻蜓点水”。有些学习者一天看两三个算法,看到第三个第一个就忘了。我的做法是,每天只处理一个主算法,用四轮10分钟拆开过脑。宁可放慢速度,也要让这个算法在自己脑子里可以独立跑一遍。
主线算法的选择标准有两个:第一,它是很多题目的底层基础,比如二分、BFS、动态规划模板;第二,它在未来的工程场景中有直接对应,比如对于做前端的人,树的遍历是逃不掉的,对于做后端的人,并查集和字典树可能经常出现在中间件类的代码里。
2.3 阶段三:变体泛化与交叉综合
到了这个阶段,基础算法的骨架已经过脑完毕,挑战变成了“组合拳”。一个题目往往不是单纯的二分或单纯的贪心,而是先贪心排序再做动态规划,或者先哈希统计再结合前缀和。这时候学习的重心从单个算法转向算法的组合与变体识别。
我采用的方法是“母题+变形题”对照法。选定一道母题,比如最长递增子序列,然后用它去对照:
- 要求输出具体序列而非长度,怎么办?
- 加上字典序限制,用哪个算法?
- 数据量从10^3变成10^6,原来的DP还可行吗?
- 数组改成二维矩阵,状态定义怎么变?
每个问题都找对应的一道题,但不要马上看答案,而是从母题的状态定义出发推一遍。推歪了也没关系,过脑课允许错误,错误带来的记忆强度其实比正确还高。
我还做了张个人备忘表,把学过的算法按“触发关键词”分类。比如看到“有序数组”优先想到二分,看到“最多几次交易”这种字眼想到有限状态DP,看到“相邻元素约束”想到打家劫舍状态结构。这些触发词不是万能的,但用来快速定位思路非常有效。
3. 10分钟过脑课的核心操作细节
3.1 每轮10分钟的时间分配模板
无脑操作是没法过脑的。我根据实际的体验,总结了一套时间分配模板,适用于任何一个算法的学习和复习。
前2分钟,触发与激活:闭眼回忆一下这个算法是干什么的、上一次学的时候卡在哪。这个动作能激活记忆里的旧连接,为接下来的输入作准备。
中间5分钟,精读或手推:学新算法时,这5分钟用来精读核心材料。复习旧算法时,这5分钟用来闭卷手推整个流程,包括数据结构的状态变化过程和循环的推进方式。
后3分钟,强输出:用一两句话写清楚这个算法的本质。尤其要写清楚“什么时候用我”和“什么时候不要用我”。写不出来的地方就是薄弱点,标记下来,下一轮10分钟单独补。
以二分搜索为例,最后一轮的后3分钟可以写成:“有序数组或者答案具备单调性时可使用;每次把搜索空间砍半;核心坑是区间开闭和边界更新;不要用在无序且无法排序的数据上。”就这么几句话,信息密度极高,复习时扫一眼,比重新看五分钟视频有用。
3.2 所谓的“过脑”到底记住什么信息
明确一下过脑课的“记忆四要素”,因为很多人不知道要记什么,最后就是把代码背下来了。算法不是靠背的,靠的是四类信息:
第一,使用前提。算法成立的条件是什么?比如二分必须有单调性,DP必须满足无后效性和最优子结构。这些条件记不住,遇到变题就会瞎套。
第二,操作流程。把算法看成过程,从输入到输出的关键步骤序列。不追求细节代码,但每一步做什么要清楚。
第三,复杂度模型。时间复杂度和空间复杂度是什么级别的,这决定了它在真实场景里的可用性。尤其是超大数据量问题时,设计取舍全靠这对复杂度。
第四,典型案例。每个算法至少记住一个最经典的案例。比如提到拓扑排序就想起课程选修顺序安排,提到最小生成树就想起城市网线铺设。案例的作用是给算法一个具体的锚点,抽象知识一旦有了具体例子拉着,就很难丢掉。
3.3 手写代码时的三个提示性自问
在手写实现那轮10分钟里,代码写不出来往往不是语法问题,而是流程问题。我给自己设了三个提示性自问,每次卡住就问自己:
第一个问题:我现在这一步是在处理数据结构的什么状态?是初始化、是更新、还是终止?问清楚状态,很容易定位到卡住的地方。第二个问题:这个循环结束后,所有数据对象的集合是否都覆盖到了?有没有漏掉某个部分?漏处理是初学手写算法时最常见的错误。第三个问题:如果不考虑这次循环的当前值,下一次循环还能不能推进?如果不能,说明推进条件有问题。
这三个自问能解决多数“代码和思路对不上”的问题。有次我写归并排序的合并过程,写的循环条件里忘了把两个辅助数组的下标都检查完,导致剩余元素没拼回原数组。就是靠第一个自问发现少了状态覆盖,再补上末尾的while循环就解决了。
4. 实战解析:三道算法题是怎么用10分钟过脑吃透的
4.1 案例一:二分查找的标准螺旋
二分查找是典型的“看着简单,写不对”的算法。我过脑学习的时候,用了四轮循环:
第一轮10分钟学习前,先回忆一个常见的实现错误版本,比如while left <= right和while left < right的边界问题。然后花5分钟看经典实现,理解左闭右开设计是C++和Java库的通用习惯。后3分钟写答案:“二分用于有序序列,重点在维护搜索空间的上下界,循环退出后判断返回的是left还是right。”
第二轮10分钟手写实现。我就写最简单的版本,然后自测三组用例:数据长度为奇数、偶数、目标值不在序列中。
第三轮10分钟开始引入变体,比如寻找左侧边界和右侧边界。这轮我的核心问题是:标准模板里返回的是某个值的位置,如果要求第一个不小于目标值的位置,循环条件还是不变,但返回值和收缩方向要怎么改?我画了一张区间收缩表,把各种情况下的区间变化列出来,表就是过脑产物,以后遇到变题直接回忆这张表。
第四轮10分钟做变体对照:找旋转数组中的最小值,本质上也是二分,但不能用传统标准模板,因为有序性被破坏了,需要判断mid处于哪一段有序区间。这一步能真正检验前面的记忆是不是固化了。
这套流程下来,二分就不只是“背模板”,而是理解了区间收缩逻辑,当再遇到任何二分变体,就能根据区间不变式重新推,而不是靠记忆里面的旧代码。
4.2 案例二:动态规划里最典型的0-1背包
0-1背包是动态规划学习者躲不掉的坎。难点有几个:状态定义为什么是二维的、外层循环为什么遍历物品、内层循环为什么要倒序。
第一轮10分钟我学的是基本状态定义:dp[i][j]表示前i个物品在容量j下的最大价值。这个定义本身不难,难的是为什么这么定义。需要想清楚,二维是因为有两个自由维度需要被记录,一个是物品范围,一个是容量限制。倒序更新是为了保证每个物品不重复使用。为了过脑这些点,我做了个小实验:把内层循环改成正序,看看最大价值会怎么变,然后自己解释原因。
第二轮10分钟我手推了一遍状态转移表,选了4个物品、容量为5,从dp[0][0]开始逐步填到dp[4][5]。不要用程序算,就用纸笔。填完表格后,表格本身就成了动态规划思想的具象化模型。这一步做完后,一维滚动数组的优化方案不用怎么学就看懂了,因为二维表在“逐行更新”时,完全可以用一维数组滚动覆盖,倒序迭代刚好防止覆盖尚未处理的状态。
第三轮和第四轮都是变体冲刺。每轮10分钟只解决一个变体问题,比如要求恰好装满背包时初始化为无穷小,比如物品可重复使用的完全背包内层循环改回正序。每个变体都要回答它的状态转移方程变化在哪里、为什么变化。10分钟如果没想透,宁可直接承认没消化,下一轮再来,也不准凑合看一眼答案就过去。
4.3 案例三:二叉树的层序遍历与递归范式转换
树的遍历是递归思维的分水岭。层序遍历正好能把队列这个数据结构和树的递归特征结合起来。
我学层序遍历时的第一轮10分钟,先写出一个最简单的递归先序遍历代码,画出调用栈变化图。这个图的目的是理解递归背后的栈结构,然后再把递归栈换成显式队列,就自然推论出层序遍历的BFS思路了。
手写实现时,最容易出错的地方是“每一层单独收集结果”。如果是多行遍历结果按列表存储,需要知道在循环里先记录当前队列长度,再进行固定次数的节点出队和子节点入队。如果不记录length,队列中原有的节点和新入队的子节点会混在一起,层与层的边界就丢了。
变体部分我练了锯齿形遍历(Z字形),核心改动只是加一个层号奇偶判断和一个辅助栈翻转操作。这个变体的价值在于,把“层边界”和“顺序”两个维度分开处理,彻底强化了对层序遍历内部机制的掌握。
这三种不同类型的算法案例,分别代表了“一维搜索”、“多维状态递推”、“非线性结构遍历”三种基本思维范式。它们过脑成功后,再学其他算法会发现学习速度变快,因为很多新算法都是这三种范式的组合与叠加。
5. 常见问题与排查:过脑路上会踩的坑
5.1 问题一:每天安排多个算法,结果一个都记牢?
这是最常见的翻车场景。一天刷五个算法题,看完一个写不出来就看下一个,似乎很充实,实际上全是碎片输入,根本没有输出固化的时间。
排查思路很简单:检查你是否完成了“输入后隔一段时间再输出”这个动作。如果得出的答案是“没时间”,那就削减计划。一天一个算法甚至两天一个算法都行。质量比数量重要。我做过对比实验:连续一周每天四个算法然后周末复习,效果不如每天一个算法、每三天复习一轮。记忆的牢固程度取决于重复提取的次数,而不是首次接触时的专注程度。没有主动提取的过程,内容只会快速消退。
5.2 问题二:写代码总是卡在边界条件
边界条件出错基本可以归因于没有把“循环终止条件”和“状态边界”在过脑时单独标记。很多人的笔记只记了“如果数组为空返回0”这种一句话,实际上边界条件的记录方式应该是这样:
- 什么条件会导致循环一进入就结束?
- 循环体的末尾,什么变量被更新了?更新后到底离终止条件更近了还是保持不变?
- 输入规模为1时,整个算法是否还成立?
把这三个问题写进笔记,比记一百行代码都有用。边界条件正确性的核心是“不变式思维”,即每轮循环结束之后,某个性质依然成立。只要这个性质不被破坏,边界再怎么变都有推导路径。
5.3 问题三:学了后面忘了前面,过脑也拦不住
这是需要接受的事实,遗忘是必然的,过脑不是为了让记忆永不消退,而是为了在必要时能快速回想起来。我的实践方法是每周末做一次“扫盲式过脑”:把本周学过的所有算法的使用前提列成一张表,列表里不出现具体流程,只写“何时用、复杂度是多少、典型例题是什么”。如果只看这张表就能想起大部分细节,说明记忆仍然活跃;如果某个算法连前提都想不起来,直接触发一轮该算法的10分钟复习。
我还试过一个偏方法:刻意给每个算法画一个一平方厘米的小图标,比如二分画一条对半切的线段,背包画一个装满格子的小方框。这个视觉锚点虽然看起来不那么“正经”,但实际用起来很灵,图像记忆比文字记忆稳定率高不少。
5.4 问题四:经常出现“感觉会了但做不出来”
这个问题要从两个角度排除。一是错觉型会了,表现是能流畅阅读别人的解析,但无法独立推理。解决办法是增加无提示输出的频率,比如认真看了题解后必须合上题解,闭卷写一遍完整流程。二是断层型会了,表现是算法本身理解了,但对应的数据结构或语言操作不熟,比如会用DP但不会用字典优化,或者priority_queue的自定义比较器写不对。这类问题的排查重点是是否遗漏了前置知识地图上的节点,遇到类似情况最好回补该数据结构的专题内容,分割成两三次过脑课消化,而不是硬啃。
6. 工具与记录:如何把过脑课变成可复查的资产
6.1 一个极简的过脑笔记模板
笔记不需要花哨,但必须结构统一,方便检索。我用的过脑笔记模板包含六行字段:
- 算法名与归类:比如“二分——区间收缩型”或“DP——序列DP”。
- 使用前提:短短一两行,例如“数据必须有序或具备单调性”。
- 核心步骤序列:最多四行,超过四行说明理解不够精炼。
- 复杂度复杂度:一张小表里写清时间、空间。
- 经典例子:一个抽象化的应用场景。
- 边界条件与易错点:每轮过脑后补充,它可以不断增长。
这套模板每写完一个算法就是一张卡片,之后复习的时候只看卡片,不重新翻大段笔记。
6.2 使用刷题记录表代替刷题数量统计
我身边不少朋友都在刷题软件上比谁刷得多,但我认为更值得维护的是“过脑状态表”。这个表按算法主题分行,每行记录三列:最近一次过脑日期、当前状态(生疏/熟悉/深刻)、下次复习日期。每周花三五分钟更新这张表,它会让学习路线从“模糊感觉”变成“可视化进度”。
根据这个表给算法排优先级:状态为“生疏”的算法要安排在第二天;状态为“熟悉”的可以每两周扫一次;“深刻”级别的算法不必反复看原版内容,最多看变体题。这个管理方式能有效避免平均用力,毕竟人的精力总是有限的。
6.3 如何挑选适合10分钟过脑的学习材料
材料的适配性很重要。不是任何视频和文章都适合10分钟过脑,我对材料的判断标准有三条:
第一,是否有清晰的“问题-动机-方案”三段落结构。如果材料从头到尾讲技巧,不讲动机,学完后很难记住使用前提。第二,是否有图表描述数据结构的状态变化。静态代码加长篇文字对初学不利,动态图或手画状态转移图帮助最大。第三,是否有至少一个可复现的经典例题。纯理论材料可以用,但配例题的材料过脑效率更高。
如果手头材料不符合这三条,我建议自己补一段自我提问,把缺失的信息在过脑时填上,也相当于二次加工,效果甚至比直接读高质量材料还好。
最后说一点个人体会。算法学习这条路上,真的不缺资料,缺的是把资料变成自己东西的转换过程。10分钟过脑课本质上是在逼自己做这个转换,每次关上书本、闭上视频,逼自己从零推导一遍,大脑就在强制建立路径。这个过程不轻松,但你就是靠着一次次“写不出—卡壳—想明白”的循环,才真正成长起来的。如果你正处在看什么都觉得懂、做题就懵的阶段,可以试着从今天开始,每天抽两个10分钟,先拿一个简单算法完整过一遍脑,坚持半个月,你自己的感觉会告诉我这个方法到底值不值得。
