分享一下我入门数据结构和算法的路径:
图中视频课都是在B站有资源的,我比较推荐的资源相关链接:Hello 算法电子版,代码随想录,代码随想录视频课。
如果你想学习数据结构与算法,我有一个更好的路径推荐给你,可以让你在学习过程中有更缓的学习难度曲线,更好的去入门,并且不受编程语言的限制:
首先通过《Hello 算法》入门,构建整体的算法框架,再体系化学习算法,填充框架。《Hello 算法》里有清晰易懂的动画图解和可运行的代码示例(常见的语言示例都有),难度曲线合理,易使读者理解算法和数据结构的核心概念,并能够通过编程来实现它们。
这本书在 GitHub 上很火,已经有 114k 的 Star了。
同时该书有很多经典题可以在力扣找到,在学到时可以同步到力扣刷题,通过实践来验证所学的知识。
在体系化看完《Hello 算法》后,就可以进入到刷题阶段了。代码随想录把题型进行了分类,我们可以很好的根据类别来进行刷题。
代码随想录有文字版和视频版,相比文字,我更喜欢通过视频来学习知识。我刷题的步骤是:
这里吐槽一下力扣题解的评论区,我总是能在里面看到贬低自己的评论,我觉得真的没必要,且这样做会让自己真的变蠢😅(因为大脑会把它当成指令或事实,不断重复这种说法,会强化你对自己的“蠢”的认知)。没有人一开始就会算法,且我们不是要去自己发明一套算法,而是去解算法题。能不能解开算法题的信息差就在于解题思路,只要你知道思路,就能解开。这与智力无关,与努力有关。右图是我解无重复字符的最长字串的早期记录,给大家看看缓解下焦虑😄。
![]() | ![]() |
---|
跟着代码随想录把整个算法体系都刷一遍之后,恭喜你,成功入门算法了,此时面试手撕算法对你来说应该不成问题了!
也许你会有学完后面忘掉前面的烦恼,重复练习可以让你的烦恼减轻,就像我制定「每日一道算法题」的每日任务一样,你也可以根据你的情况复习算法。如果你学习算法的目的是为了面试,那么我推荐你这个网站:CodeTop,它支持按公司、部门、岗位组合查询算法题考察频次数据,方便大家高效检索练习。
从一年前入门算法到现在,也有一年了,这期间的酸甜苦辣只有自己知道😇。7 月绿到发黑的热力图一定程度上反映了我当时找工作的心切和焦虑;8、9 月断断续续的绿点,是我找到工作后想更进一步,在 “把刷算法题培养成习惯” 和 “好累,能不能放过我这一次” 的想法间反复横跳的证明;而当我成功养成习惯后,打卡记录逐渐趋于稳定,即便零星有空白也会在第二天补上(我甚至在旅游期间都每天做算法题,不得不夸下自己我太牛了😄)。
一开始学习算法是为了找到更好的工作,因为大厂面试中算法是必考内容。成功找到工作后,我想把「每日刷一道算法题」培养成习惯,这有两个好处:一是理解和编写优秀代码的能力 —— 虽然实际工作中极少需要自己实现完整算法,但抽象程度高的代码实现都有着算法的参与,比如二分法、递归、优先队列等,数据结构与算法的思想能帮助我更好地理解源码;二是若以后工作有变动,就不至于需要花费大量时间重新学习算法。
将「刷算法题」培养成习惯不是一件简单的事情,刷题是枯燥的,算法是困难的,两者光是组合在一起就让人感到痛苦😫。那看起来不太可能实现的习惯,我是如何办到的呢?其实我只是遵循一个非常简单易懂的准则:使它易于实现。
细心的朋友可能已经发现了,我在上文制定的习惯目标是「每日只刷一道算法题」,目的就是为了减少我的负担,让我觉得这是一个不会耗费太多时间的事情。并且,我没有规定刷算法题的难度,同样减少我的负担——大部分时间我解答的都是简单、中等题,我解答的困难题仅仅只有 17 个。
更过分的是,我没有规定不能重复刷一道题,这样一是可以加深对某些面试高频题的理解,二是依旧减少我的负担——力扣上我无重复字符的最长字串整整提交了 27 次😄。
以上种种做法,都是在为了在培养习惯时让其易于实现。“我不想每天在算法题花费太多时间”,没关系,每天只做一道题就行;“我觉得算法题好难,我 cover 不住”,没关系,做个简单题或者复习做过的题就行;“我昨天太忙了没时间做算法题,热力图上已经出现空白了,好烦,想摆烂了”,没关系,中断很正常,不必执着于完美,降低实现难度今天补上就行;“今天只有最后 2 分钟就过去了,来不及了怎么办”,没关系,哪怕花 1 分钟去提交之前写的代码,也比不做强,不在于你做了多少,而在于你有没有形成“惯性”。
当然,系统地养成习惯不止让习惯易于实现(我认为这是最重要的一点),尽可能做到:
不要:「我要刷算法」
要:「每日刷一道算法题」
让这个习惯有“起点” —— 用已有行为触发它。
例如我的触发器有:
- 工作期间午休 or 晚休期间 -> 刷一道算法题
- 在飞书设置每日定时任务,未完成提醒 -> 刷一道算法题
哪怕每天做1分钟,也比不做强,形成“惯性”
做完后奖励自己,例如完成该飞书任务、打会游戏
中断很正常,别因此自责或放弃,如果失败了,找出原因并及时调整,例如:
- 算法题要做很久 -> 降低难度从简单题做起