既然想要系统地掌握算法和数据结构,那自然是要看书,上课,和练习相结合。
三管齐下,缺一不可!
所以我从三个方面来讲一下。先是书籍推荐,再是网课选择,最后是练习平台。
只有转化成了你代码的算法和数据结构,才是掌握了的算法和数据结构!
书挺多,但经典的也就那么几本,而且我建议选定一本之后,看多遍。而不是看好几本书,每一本都走马观花过一下。
首先是算法方面,算法和数据结构是计算机学习的基石。无论你学习计算机的任何方向,没有扎实的算法和数据结构,肯定学习起来就捉襟见肘了。
我自己非常喜欢的普林斯顿算法红宝书 第四版,这本书是普林斯顿超级大神教授Robert Sedgewick的神作,该书还有配套的MOOC课程,以后有时间再写网课了。该书是特别棒的算法和数据结构的教程,全书提供Java的实现,而且大部分内容也放在了本书的配套网站上:https://algs4.cs.princeton.edu/home/ 本书的优点是会把算法详细的过程掰开揉碎地讲明白了。书里面有大量的配图,更不说配套网站上的ppt,简直就是艺术。一句话,1万分推荐。就一个缺点,没有讲动态规划(DP),所以我在下面也推荐一些涉及到DP的书籍。你认真读此书的话,会发现很多大公司的面试题就来自它的习题里面。
还有另外一本算法神作就是算法设计手册了。这一本则是把算法分类了,还提供了特别多适用的算法应用场景,让读者知其然,并知其所以然。这本书的数和图部分,还有递归回溯,是特别多人拍手称赞的地方,值得认真看三遍。这本书就讲了第一本里面遗憾缺失的DP。总之,这两本都是超级强推。
前Google大佬,Steve Yegge非常推荐的计算机书籍之一:
有时间的小伙伴,他的这篇博客很值得一读:http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html。 Google的Interview Guide,很多就出自这篇博客。
提到算法,肯定会提到算法圣经之算法导论,这本书是算法百科全书,优点是全,缺点是太全太厚,数学太多了。是很好的参考书,但不适合短期突击学习。感兴趣的读者可以挑战一下。
接下来的两本,可以当做是算法的课外读物,写得浅显易懂。刚开始学算法的小伙伴,可以先从他们着手,第一本其实是合集,叫Algorithms Illuminated。分三个部分:基础,图算法和数据结构,贪心算法和DP。该合集页数比较短,但是看完之后,对算法的理解肯定会加深不少。
接下来就是算法图解了,语言风趣,有比较多的插图。入门很合适。
最后一本算法书,名字就叫算法(Algorithms),作者还提供免费的教程,我个人觉得对面试帮助很大。因为里面讲解算法的思路,有点以题目为导向的感觉,其中递归和DP部分,让我有醍醐灌顶之感。
可以通过下面的链接,直接官方下载PDF:
第二部分是数据结构,这里就推荐三本书,一本是Java,一本是Python。Java的就是鼎鼎大名的CS61B的课程推荐教程:Data Structures and Algorithms in Java。Python的也是一本畅销书:Problem Solving with Algorithms and Data Structures。
还有就是中文的《大话数据结构》,数据结构中文入门读物的不二选择。
算法课程强推四门。
Again,选一个好好多学两遍,别都想学,没那么多时间,贪多嚼不烂。
网络课程的话,则是十二分强推UCB的CS61B。他们家的计算机系的CS61A,B,C课,简直制霸各种课程推荐列表。
2. MIT的算法课,教程用的算法导论,也是强推的网课:https://www.youtube.com/watch?v=HtSuA80QTyo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb 这门算法则基本不涉及到语言层面,主要是算法层面,讲得很好。
3. 然后就是红宝书的网课以及配套官网:
https:// algs4.cs.princeton.edu/ lectures/
https://www.youtube.com/watch?v=1QZDe28peZk&list=PLRdD1c6QbAqJn0606RlOR6T3yUqFWKwmX
4. 斯坦福2018 Winter CS106B: Programming Abstractions,虽然从名字不太能看出来,但其实是用C++讲数据结构,想用C++的小伙伴不容错过,我看了一半了,特别有帮助,尤其是对递归和回溯的讲解,简直醍醐灌顶。
现在因为不可知的原因,Youtube上面已经下架这门课程,但更方便的是,咱们可以在B站直接看:
https://www.bilibili.com/video/av21620553?p=1
光学(看书)不练,算法和数据结构是学不会的。
所以推荐一些好的刷算法和数据结构平台,当然另一方面也是为了找工作面试做准备咯。
如果你在北美的话,初级程序员面试基本就是考察数据结构和算法,所以大家一定要勤加训练!
给大家送一个福利,LC慷慨给读者小伙伴们送出15% off (优惠24刀)的年费折扣了。不需要等到一年一度的感恩节,也能享受到不错的折扣。平时有需要的小伙伴,可以使用这个链接:LeetCode Premium 通过链接购买年费会员才能享受折扣。
LC的年费还是有很多好处的,可以按照频率刷题,看公司tag,还能看到不少问题的视频答案(新功能),锁住的题还有官方solutions等等。
这是现在刷题找工作最热门的网站了。
但LeetCode现在题目也太多了,一共1300+了,而且一直在增加!!!
全刷完没必要,也不高效,所以推荐看下面的回答:
2. Educative
他家最最出名的还是这门Grokking the System Design Interview, 但凡提到准备系统设计,这门课都上入门必推的:
还有这门算法课:
这门课程是一个算法总结提高的课程,它把算法面试中可能遇到的题分成了各种模式,每类题各个击破。
(如果你需要上面这些算法课程,那么你可以使用 awesome-developer 的折扣码获得网站所有课程的额外15%off!上面的折扣码针对单独购买所有课程有效。
如果想买订阅(Subscriptions)的小伙伴,则可以用 0820-ZH93025 (必须一模一样输入)的coupon code来获取额外八折的优惠 按年和按月均适用,折扣码十月四号过期,有需要的小伙伴抓紧)。
过了十月四号就只能用 ZHIHUEDU-10 的九折优惠了,大家有需要的抓紧,还有不到两周!
比如有最经典的sliding window模式,Two pointers模式,快慢指针模式,合并intervals模式,cyclic sort模式,in-place翻转链表模式,树上的BFS,树上的DFS,双Heaps模式,subsets模式,二分法变种,Top K模式,多路模式(K-ways),0/1背包,拓扑排序。
对算法最有帮助的课程是:
专门针对数据结构的课程有:
C++:
JavaScript:
Java:
Python:
我上过其中的Java版本,课程是把数据结构里面的基础数据结构都用java实现了一遍,对于用java的同学特别有帮助,java的基础在刷题的过程中,还是要必须掌握的。
课程从复杂度开始讲起,Arrays,LinkedLists, Stacks/Queues, Graphs, Trees, Trie, Heaps, Hash Tables等数据结构,全都实现了一遍。而且还有配套的基础LeetCode题。是一个入门的很棒的教程。选择其他语言的话,内容应该也是差不多的。