大家好,我是方圆。最近花时间学了学算法,应该算是我接触Java以来第一次真正的学习它,这篇帖子我会说一些我对算法学习的理解,当然这仅仅是浅浅的入算法的门,如果想深挖或者是有基础的人想提升自己,我觉得这篇文章不合适;如果你是算法小白或者是大一、大二有充裕时间的同学,它可能真的稍微有一点点帮助。
1. 交代背景
非科班转码近两年才开始学习算法,之前一切的算法知识全部来自《算法图解》(一本基础性的漫画算法小册)和百来到LeetCode题目,这也导致了我算法知识全是一块一块的,完全没办法衔接起来,面试题也仅仅只是对刷过或类似的题能解,纯纯复刻高三“题海战术”。
2. 算法学习开始的契机
一次工作的间隙,正得意于自己提交的代码如此“简洁”时,便听见了“方圆,你看看这个方法,可以一次遍历完成,但你做了两次遍历,而且还不好读!”
这番提醒对我来说是当头一棒,心想“你这小欻欻!敢对我的整洁代码有意见?!”,便强装嘴硬:咱俩考虑这个方法的角度不同,吧啦吧啦解释一番…
但我回头还是把这个方法的执行逻辑改了,这开始让我意识到,我对算法很不敏感,也从来不会在时间复杂度上去考虑问题,从此便埋下了算法学习的种子。
而种子的开花结果是在某算法大佬直言不讳下催化促成的。一次有幸向大佬的算法开源仓库提交章节贡献,本以为自己写的逻辑清晰,简单易懂,但是在大佬的严格审核下,被批的体无完肤:“你可能更适合写一些便基础的内容…”,一下就让我不值几两的自尊心粉碎,发誓不学好算法不罢休。
3. 学习路线
接下来是主要内容,分算法和LeetCode两部分。知识的来源全部来自书,没有视频,我个人也不倾向选择视频学习,我觉得书籍在很大程度上是知识最好的传播媒介。
算法
- 《算法(第四版)》: 思来想去我还是想把这本书放在最前面,虽然它是一本不太好读的大部头,翻译欠佳(比如把指针/Java引用翻译成链接…),但是如果你有耐心且时间充裕的话,还是希望你能够选择去读经典的书籍。做一做它每个章节后边的习题,你会在这本书上花很多很多时间,我也相信你因此会有很大的收获。从我这两年陆续读技术书的体验来看,还是推荐以经典为主,素人/网红/大Tittle名人写的书优秀内容较少,有发展粉丝经济的嫌疑。
- 《Hello 算法》: 如果你刷过剑指Offer的话,那你应该对它的作者比较眼熟。这是一本开源的算法入门电子书,其中所有的内容我全部看过,很用心也很有启发性,但是它还没有完结,不过因此的好处是你可以借此机会去仓库贡献内容。即使你读了上一本书,这本书也必读,而且我建议两本书一起读,先读这本书中的内容,再去《算法》中找相同的章节读,做一做后边的题目,这样能够降低一些《算法》晦涩的程度。
书籍链接: https://www.hello-algo.com - 《数据结构与算法之美》: 你说你完全读不进去大部头,那行啊,可以看看这本,国人写得书,比较好读,而且它还结合了一些算法应用的实例,不过一些延展的例子讲得不深,让人觉得浅尝辄止,不过用来入门完全够了,总体还是推荐的。
- 《算法图解》: 别读!别读!别读!太基础,所有的内容都能在上述书中找到且讲得更好。
LeetCode
- 《LabuLaDong的算法小抄》: 也是一本开源的免费电子书,不过我觉得这本书太 “繁重” 了,只关注它的第零章、动态规划和二叉树部分的讲解就好,其他部分建议直接在刷题的时候看高赞题解。大家不要去买这本实体书,电子版内容就很全了,实体书很像是“XXXXXX”。
书籍链接: https://labuladong.github.io/algo/di-ling-zh-bfe1b/ - LeetCode高频题: 刷题一定要分类刷,先刷链表、再刷二叉树、之后刷动态规划、回溯和递归类型的题,其他的数据结构类、双指针类等其他类放在后面。我自己做了一个刷题的仓库,是我刷过的一些经典题,它不只是简单的分类,在每个分类里我也做了一些细分和必要的思考点,每道题都链接好了LeetCode题目,能点过去直接刷,比较方便。我觉得对算法入门来说应该是完全够了,刷题过程重要的还是要做好总结,因为题量越来越大,不可能每一道题都刷到,有了自己对题的理解和思考才是最重要的。
LeetCode仓库: https://github.com/FangYuan33/LeetCode
祝大家学得开心