☰
算法日迹:从零开始的系统性算法学习路线与刷题方法论
2026/10/19 9:41:29 网站建设 项目流程

我决定把这个系列的第一篇写成“必看”,是因为在做“算法日迹”之前,我心里已经有了好几套闪闪发光的刷题计划。可真正坐下来,把准备过程从头到尾过一遍之后才发现:大多数人学算法,根本轮不到拼智商和毅力,光是在“准备”这一步就已经被自己劝退了。所以这篇简介,不聊具体题目,也不写代码技巧,只认真回答三个问题:这个系列是什么、我为什么开始、以及你该怎么跟着走。

算法日迹,说白了就是我给自己的算法学习过程建立一份持续更新的记录。它不是一份标准教程,而是一条从零开始的真实轨迹。我当时的处境比较典型:非科班出身,业务代码写了几年,日常几乎没碰过复杂数据结构,对动态规划、图论之类的东西停留在只能听懂名词的程度。决定系统性补算法的原因也很朴素——某次排查线上问题时,我被一段性能瓶颈卡了整整两天,最后发现只要换一种数据结构,时间复杂度就能从平方级降到线性级。那次经历让我意识到,缺了算法这块拼图,写代码这条路早晚要撞上限高杆。

这份记录适合谁呢?如果你正打算开始学算法,或者已经刷了几十道题但总觉得原地打转,又或者纯粹好奇别人是怎么从零啃下这块硬骨头的,那这个系列应该对你有用。我会尽量把每一步为什么这么做讲清楚,把我踩过的坑原样摆出来,不包装,不粉饰。这一篇尤其值得细看,因为所有日期的起点、所有计划的原点,都在这里了。

1. 这个系列到底打算做成什么样

1.1 先给“算法日迹”定个调性

在定这个系列的方案时,我最纠结的一点是:应该做成那种“每周一题精讲”的知识型栏目,还是做成自己的学习流水账。两边的价值我都认可,但最后选择了一个折中方案——以我自己的真实学习进度为主线,把知识讲解、思路复盘、代码实现、心态变化全部揉进同一条时间线里。

这样做的理由其实很实际。市面上讲算法题解的内容已经非常密集,根本不缺我这一份。但真正稀缺的,是一个“还在路上的人”的完整过程。那种已经站在终点的人回头看路,往往只会记得几个关键关卡,会把过程中的大量停滞、反复、崩溃都过滤掉。而正在爬坡的人最需要的恰恰是这些细节:卡住时是什么状态、怎么突破的、突破之后回头看有哪些解法其实在一开始就该想到。

所以我把“日迹”当作核心气质。每一篇都会记录具体日期,记录当天的学习状态,甚至记录某道题让我熬夜到凌晨两点的全过程。这不是为了营造刻苦人设,而是因为我自己在搜索经验时最常感到无力的,就是大家只展示答案,不展示中间那段黑的。我心里很清楚,这种真实日常的价值,在坚持到第十篇、第五十篇之后才会逐渐显现。

1.2 为什么第一篇要特意标注“必看”

熟悉博客内容的人可能知道,“必看”这种标注通常出现在套话里,没什么实际信息量。但我在这篇标题里特意加上“必看”,是有具体用意的。我自己的学习记录里,至少有三四本笔记是一开始就走了弯路的——买了一堆书、收藏了几百个链接、制定了雄心勃勃的三十天计划,然后就没有然后了。原因不在于意志力差,而在于最初没有想清楚规则和边界。

这一篇“算法日迹”的简介,本质上就是给整个系列制定规则。我会在这里回答:接下来的半年里我要学哪些内容、按什么顺序学、用什么方式记录、每周抽出多少时间、遇到状态差怎么办。这些安排直接决定了后面每一篇日迹的形态。如果跳过这一篇直接跟着后面刷题,很可能出现的情况是:你看到我某天在练某道动态规划题,但不知道那对应整个知识树里的哪个位置,也不知道我之前为这道题铺垫了哪些前置知识。

所以这一篇不仅仅是一个系列的导语,更是后面所有内容的地图。哪怕你现在还没想好要不要长期跟这个系列,我也建议花十几分钟把这篇看完。至少你可以从里面拿走一套自己用得上的算法学习框架,至于要不要跟着日迹一起走,那是后话。

2. 梦开始的地方:我为什么突然要学算法

2.1 从一次线上事故说起

讲“梦开始的地方”,我得先把启动我这个决定的那根稻草找出来。当时我在某公司做后端模块开发,负责一个数据汇总的功能模块。功能本身不复杂,就是把一批用户行为数据按条件过滤、聚合、返回结果。上线初期数据量不大,一切正常。结果到某个月底,数据量涨了一波,接口响应时间肉眼可见地飙升,最慢的时候超过十秒。业务方每天都在催,日志里全是超时报警。

我先后用了很多常规手段:加索引、加缓存、调整数据库连接池、甚至把一些逻辑搬到异步队列里。效果有,但只是把问题往后推。后来某位同事看了我的代码,指着一个深层嵌套的循环说:你这里每一次外层循环都要把内层列表完整扫描一遍,数据量一涨就是平方级增长,换一个哈希索引结构,秒级变毫秒级。我当时代码换成哈希表之后,接口耗时直接从两千多毫秒降到了四十毫秒。

那次经历给我的触动非常深。以前我总觉得算法是面试才需要的东西,工作中够用就行。但那一刻我才明白,算法基础不是面试题,而是一套判断代码好不好、能不能扛住规模化的思维工具。我缺的不是一个哈希表的知识点,而是一套遇到问题先分析复杂度、先思考数据结构选型的思维方式。从那之后,我开始认真考虑系统学习算法。

2.2 “梦开始的地方”到底指什么

很多人把“梦开始的地方”理解成一种情怀式的表达,好像是为了渲染仪式感。但我用这个词,是在描述一个非常具体的认知转变节点:从“算法是考试关卡”到“算法是解决问题的武器库”。这个转变发生的那一天,对我来说就是梦真正开始的地方。

在那之前,我也刷过一些算法题,但动机全是被动的——为了应付面试、为了不落后于别人。刷题的过程基本就是打开题库、挑一道顺眼的、看题解、背答案。用这种方式刷了一百多道之后,我做新题依然没有思路,做过的题换一个马甲就不认识了。回头想想,问题恰恰出在把“刷题数量”当成了“算法能力”。从那以后我把策略整个翻了个面:不再以“做几道题”为单位,而是以“理解一类算法”为单位。一道题做完了,不是结束,而是开始——要总结它属于哪类模式、这类模式的思考框架是什么、还有哪些变体。

“梦开始的地方”也是我第一次认真写下“算法能力拆解清单”的日子。我列了几个维度:数据结构基础、算法思维模式、复杂度分析直觉、代码实现能力、调试能力。每一项后面都标注了当前水平和对应差距。那张手写的清单,后来成了整个“算法日迹”系列的核心索引,每一篇日迹记录都会回到这张清单做对照复盘。现在想想,如果那天没有把目标拆解清楚,后面的学习大概率又会回到盲目刷题的老路。

2.3 想清楚“为了什么学”之后才坚持得下去

我见过太多人学算法半途而废,包括我自己最早的两三次尝试。后来我反复想,为什么很多人立了flag就是完成不了?答案很简单:动机不是自己的,而是别人给的。看别人刷题产生了焦虑,于是也打开题库;看别人拿到了令人羡慕的机会,于是也想拼一把。这种由外部压力驱动的动机,在遇到第一道难题时就碎了。

我从那次线上事故之后,给自己确立了一个长期动力:我想成为一个写代码时心里有底的人。什么叫有底?就是拿到一个需求,不只想到“能不能实现”,还能想到“有没有更高效的实现”;看到一段有性能隐患的代码,不是凭感觉说“这里好像有点慢”,而是能用复杂度的语言准确指出问题在哪个量级。这个目标足够具体,也足够长期,它不是用来发一条励志朋友圈的,而是每次想放弃时拿出来对照的坐标。

在写这篇简介的时候,我已经把这个系列做了好几期。回头看,每次状态很差、一道题做不出来的时候,拉我回来的都不是什么豪言壮语,而是那个很朴素的念头:我想成为自己心目中那种“心里有底”的开发者。梦开始的地方,确实需要一点点情怀,但撑起情怀的一定是具体目标。

3. 全局路线图:零基础到成体系的四步走

3.1 先别急着刷题,把知识树画出来

如果让我给想学算法的新手一个最重要的建议,我会说:别急着做第一道题,先花两天时间把知识树画出来。我第一次盲目刷题时,题库里做题顺序是乱的,今天做一个链表题,明天跳到一个字符串匹配,后天又来一个并查集,结果每个知识点都只接触了一点皮毛,还没等到加深理解就已经忘光了。

所以我重新出发的第一步,是系统梳理算法知识体系。我把它分成四大块。第一块是基础数据结构,包括数组、链表、栈、队列、哈希表,这些都是最常用的底层容器。第二块是树形结构,重点在二叉树、二叉搜索树、堆、并查集、字典树。第三块是核心算法模式,包括枚举、递归、回溯、深度优先搜索、广度优先搜索、分治、贪心、动态规划。第四块是经典算法专题,包括排序算法全集、二分查找、字符串匹配、图的最短路径与最小生成树。

画完这张树状图之后,我对整个学习路径有了整体认知。它最大的好处在于:我清楚地知道自己“现在在哪里”“接下来要去哪里”。比如我今天练了一道栈相关的题,结束之后就能把它挂到知识树的正确分支下,然后顺着这条分支找到后续要学的内容。这种有地图的前进和那种无头苍蝇式的刷题,体验完全不同。

3.2 按专题推进,而非按难度刷题

选题策略是一个很大的分水岭。我见过两种主流玩法:一种按题库里的难度标签刷,每天Easy起步,感觉不错,但刷到Medium经常被锤;另一种按专题刷,比如这个月专注动态规划,所有题目都围绕这类思路来练。我强烈推荐后者,理由非常直接:算法思维的建立需要“重复刺激”。

你在一个专题里连续做十道题,眼睛就会慢慢识别这种类型题目的特征。比如动态规划题,很多都有一个特点:问题可以拆成更小的子问题,且有重叠子问题。你连续见十次,这个特征就长在直觉里了,下次再遇到一个陌生的题也能更快识别方向。但如果按难度刷,今天树明天图后天字符串,大脑根本来不及建立模式识别的连接。

我的具体推进节奏是一周一专题。第一周是数组与哈希,第二周是双指针与滑动窗口,第三周是栈与队列,第四周是链表,然后进入树、图、深度优先搜索、广度优先搜索、回溯、动态规划等等。每个专题的第一两天先看基础概念并且看几道经典例题,剩余几天用在线判题平台做题,每天两到三道,不用贪多,但每一道都要认真复盘。

3.3 在线的工具链与记录方式怎么选

正式计划开始前,我还花了小半天选工具。根据我自己的使用经验,一套趁手的工具组合能让坚持的难度降低不少。需要的工具其实不多:第一,一个可以在线练题的地方,用来做题和查看解法讨论;第二,一个代码托管仓库,用来沉淀自己写的每一道题的题解,方便后续回溯;第三,一个笔记工具,用来记录每天的学习心得和思维导图;第四,一个卡片记忆工具,用来定期复习零散知识点和模板代码。

工具选择的原则是不追求多,追求顺手。我自己早期犯过的错是工具换得太频繁,今天用这个笔记软件,明天换另一个,结果大量时间花在了格式迁移上。后来定下来规则:在线做题就专注在一两个固定的平台,代码仓库固定在一个托管服务上,笔记不再乱换。所有内容有了统一归属之后,每天的学习流程变得非常固定:打开题库做题,把代码推到仓库,把思路要点记到笔记,把新学到的模板卡加入复习列表。这套流程已经变成了一个条件反射。

3.4 每一日的“算法日迹”格式长什么样

既然叫日迹,每天肯定要留下痕迹。我给自己定了一套相对稳定的内容模板,每个要素都有存在的意义。第一行是日期和当天状态评分,状态评分是一个1到10的数字,用来诚实记录当天的精力水平和学习效率。然后是当天学习主题,标注属于知识树的哪个分支。接着是题目记录,包括题目名称、核心考点、自己第一次尝试的思路、卡壳位置、最终解法思路、复杂度分析。

再往下是编码记录,我会贴上自己写的完整代码,并随手标记当天写得最顺手和最别扭的地方。最后是复盘区,通常写三个内容:今天学到的一个新思维模式、一个还没搞懂但先记下来的问题、明天计划做什么。这套格式不是拍脑袋定的。比如状态评分,刚开始我觉得没什么用,但后来回看发现,很多天写不出代码,不是因为题难,而是因为睡眠不足或者情绪不好。有了评分之后,我能更准确地判断“今天该不该硬啃难题”。

4. 路上必定会踩的坑与心态建设

4.1 坑一:把题解当饭喂,越喂越不会

这是个老生常谈的坑,但我依然要把它放在第一位,因为它太容易被忽略了。做题时如果五分钟没思路,下意识就想点开题解看一眼,嘴里说着“看完思路我就自己写”,实际上看了以后记忆里留下的只有答案。我自己的体验是,看题解时觉得全懂了,关掉页面写的时候脑子一片空白,原因在于看题解是消费,写代码是生产,两者的认知层级完全不同。

我定了一条死规矩:一道题至少独立想二十分钟才能看题解,而且看题解不是看“这题怎么做”,而是看“为什么我想不到这个方向”。后来我把参考信息作为唯一的拐杖,通常只看“思路提示”部分,不看完整代码,然后自己尝试写完。这个过程很痛苦,尤其是在最开始,每道题都要憋很久,但痛苦换来的记忆非常牢固。现在回头数一数,真正变成自己武器的算法模板,全是那些憋出来的题,不是看出来的题。

4.2 坑二:质量低的高数量刷题,只是自我感动

见过有人说自己一个月刷了三百道题,我一度非常羡慕。等到自己开始认真做之后才明白,刷三百道题并不难,难的是刷完还剩下什么。如果每道题只是快速看一遍题解、抄一遍代码、甚至用上了很多快捷操作,这不会形成能力积累,只会形成数字膨胀。练算法是刻意练习,不是重复劳动,它要求你持续待在“够得着但又有点难”的区域。

我最开始追求数量的时候,一天能过十道题。后来把节奏压下来,一天两到三道,每一道都完成“独立思考、完整编码、复盘总结”三件事,知识留存率高了很多。我自己觉得,三百道题认真做和三百道题走过场,真实的差距可能在三倍以上,而这还不是最关键的,最关键的是,认真做会让你长出判断新题类型的直觉,走过场只会让你记住老题答案。

4.3 坑三:死磕难题不回头,性价比极低

算法学习过程中,困难和挫败是常态。但有一点我花了不少时间才意识到:不是所有难题都值得死磕。每道题的难度、覆盖知识点、对你当前水平的适配程度都不一样。如果一道题涉及的前置知识你根本还没学过,那你可以先直接看题解并做好记录,跳过它进入后面的专题。硬磕一道超出当前水平太多的题,很容易把整个学习节奏打崩,甚至引发放弃念头。

我通常用的判断标准是:如果一道题我独立想了四十分钟还是一点头绪也没有,就果断看题解并接受“目前还不会”。但这不是逃避,我会在笔记里专门记一道“待攻克”标签,写上“为什么没想出来”的猜测,等整个知识树推进到对应位置再回头打它。这样做的好处是,程序的节奏不被个别高难题目绑架,同时也保留了挑战它的后续路径。

4.4 心态建设:接受“曲折前进”是唯一可持续的姿势

心态这关,是所有工具、方法、路线图发挥效用的前提。我在前几期的日迹里有过很多天的标题其实可以统一叫“又是没有进展的一天”。某个专题练到一半,突然觉得之前的题全忘了,那种感觉真的很打击人。后来我查了一些关于学习曲线的研究资料,了解到遗忘和反复本来就是长期记忆的必要路径。你以为的“全忘了”,其实只是大脑在压缩整理信息,等下次再遇到,激活速度会明显快于第一次。

我现在给自己建的期望模型是:接受每天只有一点点的进展,接受反复卡在同一个类型上,接受偶尔两三天完全不想碰代码的状态。这不是放纵,而是给自己留出弹性空间。我实测下来,越允许自己慢,越能坚持得久,反而总进度比三分钟热血要快得多。这个心态上的转变,我认为比多刷一百道题更值钱。

5. 一道题的完整处理流程与方法论沉淀

5.1 做题五步法:从读题到复盘的标准动作

经过前几十道题的摸索,我总结出一套固定做题流程,把它取名叫“做题五步法”。这套流程听起来很简单,但每一步都是在实战中被证明有必要的。每一步顺序都不能乱,也不建议跳过,尤其是复盘那一步,我后期很多重要认知都来自复盘阶段,不只是“这题我学会了”,更是“我的思维漏洞在哪”。

第一步是读题并提取条件。我会用笔在草稿纸上把题目中的输入规模、数值范围、限制条件圈出来,再写下自己的理解。第二步是抽象建模,把题目转换成数据结构或算法模式的描述,比如“这是一个二维数组连通块问题,适合用深度优先搜索”。第三步是设计思路,先在纸上用自然语言描述思路,再估算时间复杂度和空间复杂度,如果复杂度不达标,马上回头调整。第四步是写代码并验证,严格按照设计思路实现,用题目给的样例和自己构造的边界用例验证。第五步是复盘记录,把完整的思路流程写进“算法日迹”的笔记中。

5.2 复杂度分析:用小时候算账的方式理解它

很多刚接触算法的新手,对复杂度分析有一种刻板印象,觉得那是数学好的人才能做的事情。其实它的核心思想用生活里算账的方式就能理解。假设你有一千个箱子,要找出其中最大的那个。如果你需要把每个箱子都翻一次,那么操作次数跟随箱子数量线性增长,这叫线性时间,记作O(n)。如果每查一个箱子都会导致把所有箱子再翻一遍,那一千个箱子就需要一百万次操作,这叫平方时间,记作O(n²)。如果箱子数量涨到一万,线性时间只多翻九千次,平方时间就多出接近一亿次。这就是为什么哈希表能把许多问题的开销从“查了一遍又一遍”降成“差不多一次定位”。

我做题时特别留意每题模板的时间复杂度,因为在线判题平台的数据规模会直接决定你能用哪个复杂度的算法。比如n的规模是十万,那O(n²)基本就已经岌岌可危了;如果n的规模是一百万,那通常线性甚至线性对数级别才是安全区。这套判断标准练熟了之后,看一道题基本就能知道可行性边界,比闷头硬写高效太多。

5.3 复盘模板:一条日迹怎么记录才算有效

复盘是做题五步法里最容易被偷懒省略的一步,但它恰恰是沉淀方法论的关键。我给自己定的复盘模板非常具体:今天的核心收获写一个可复用的思考模式;今天的失败点写清楚是“读题漏了条件”“建模选错了结构”还是“代码边界没处理”;遗留问题标为待攻克;明天计划写一个具体的主题、一道要做的题、一个要补充的概念。

我举个例子会更有说服力。有天我练了一道树的层序遍历题,当天复盘模板写的是:核心收获“层序遍历的本质是广度优先搜索,用队列控制逐层访问顺序”;失败点“一开始没注意每一层需要单独分组,导致输出格式不对”;遗留问题“树的递归与非递归遍历边界条件再对比一下”;明天计划“继续做两到三道树的遍历题,并写一篇树的遍历专题小结”。这样的记录保证了每一道题都在为后面的题积累弹药。

6. 常见问题速查:入门期最关心的问题一览

先集中整理一份我在学习前期反复纠结的问题清单,用表格的方式呈现,方便后续回查。这里的每一行都是我自己真实经历过的困惑,不是凭空整理出来的。

常见问题最可能的原因我的处理思路
看了题解觉得自己会了,合上书又不会看题解属于被动消费,缺少主动产出过程关掉题解,用自己的话把思路写一遍再编码
几天没做题,感觉全忘光了遗忘是记忆过程的正常组成部分按复习计划回看旧题,不要焦虑,重点是再次激活
一道题卡了几个小时要不要继续难度超出当前水平,或前置知识缺失超过四十分钟没思路就先标记待攻克,转向其他专题
动态规划怎么练才能开窍只做简单题没有形成递推思维习惯先把经典入门题做熟,每一题都画出状态转移表
刷题数量重要还是质量重要对学习目标理解不清晰质量远重要于数量,一天三题精做优于一天十题速刷
怎么判断自己复盘的记录是否有效记录缺少可执行结论每条记录必须有一个“以后遇到同类题要用什么思路”的结论
遇到不会的数学知识要不要先补数学算法和数学有关联但不是因果关系先具体用时再补,优先掌握复杂度计算和基础组合思想

6.1 不会做的题要不要马上看题解

这是被问得最多的一个问题。我说说自己的取舍:十五分钟完全没思路可以看题解提示,但不要看完整代码。如果看了提示还写不出来,那就看代码,但看完之后必须合上重写一遍,必须用自己的语言把题解思路讲清楚。这个动作确保你是“理解了再输出”,而不是“抄写了一遍”。

看题解的时机也有讲究。不要在一道题上无限死磕,因为在线平台上的题难度排序并不完全符合你的学习路径,很多题是给熟练掌握更高级技巧的人准备的。把一道目前阶段不该做的题硬生生啃下来,整体收益不高。真正实用的做法是:先做该做的题,把不会的题挂进“待攻克”列表,等专题推进到位了再统一解决。

6.2 一个月能学到什么程度

经常有人问我这类预期问题。我给一个参考:如果每天投入一个半小时,按专题推进,一个月基本可以熟练掌握线性表相关的内容,包括数组、链表、栈、队列、哈希表,并且对复杂度分析有基本直觉。这个阶段结束,做中等难度的基础题已经不会毫无头绪了。如果是时间更充裕,一天投入三小时,一个月可以额外覆盖二叉树与基础搜索算法,能够独立解决大部分二叉树遍历问题。

但更重要的是别和别人比进度。我身边有学了一个月就看起来很厉害的人,也有学了一个月还在数组里打转但基础极其扎实的人。算法的路很长,起步阶段的快慢说明不了什么问题。我给自己定的预期就是每月只和一个目标对比:这个月结束之后,我能独立解决的题型面比上个月多多少。这个指标是有意识的、可度量的,比“量级感”靠谱多了。

6.3 上班族/学生党怎么安排时间

关于时间安排,我自己是上班族,这一块想多说几句。白天工作占据主要精力,晚上回家后的状态通常不太适合啃硬核新知识。我试过几天晚上硬学新专题,结果第二天的黑眼圈和工作效率双双崩溃。后来调整成“晚上做旧题复习,早上提早三十分钟学新专题”的模式。早上的大脑干净,适合建立新连接;晚上的大脑疲惫,但做已经熟悉题型的巩固题目完全没有问题。

周末时间要整块利用,我会在周六安排两大块学习时间:上午两小时学习新专题并做题,下午一小时复盘全周日迹。周日不动新东西,做本周的综合错题回顾。这个时间方案坚持下来比较稳,不会有严格执行到崩溃的感觉,也不会连续多天完全零投入。如果你也是日常时间碎片化,可以参考这个思路做自己的时间布局。

尾声:点的不是开始,点的是一盏灯

写到这里,这篇“必看”的简介也接近尾声了。最后想分享的一个真实体会是:在我决定认真做“算法日迹”之前,只以为这是给自己找一个学习方法。真正坚持下来之后才发现,它每天提供的不是“我今天又刷了几道题”的成就感,而是“我今天又搞懂了一个以前完全不懂的知识点”的确定感。两种感觉的差别很大,前者像喝水,过了就没了,后者像存钱,存得多了一点就多一点从容。

如果你也正站在自己的起点上——不管现在是零基础,还是刷过一些题但仍然觉得心里没底,我想说的是,你看到这篇简介的这一刻,其实已经不算起点了。起点的定义不是“会了什么”,而是“决定开始”。之后所有曲曲折折的记录,都会让这个起点变得更有厚度。我会把每次失败、每次卡壳、每一次突然想通的感觉都留在日迹里。你只管走在自己的路上就好,方法已经写在上面,剩下的坎,我们一起慢慢过。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询