商道如狼道 发表于 7 天前

算法学习攻略总结 : 入门至进阶,通关之路指南

❃博主首页 : <码到三十五>
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 :<搬的每块砖,皆为峰峦之基;公众号搜索(码到三十五)关注这个爱发技能干货的coder,一起筑基> 你是否也曾因为一道算法题挣扎半天,再看题解半天,感觉自己智商不在线?
学算法、刷 LeetCode 绝非一蹴而就,它需要一个循序渐进的过程。


1. 初学者的常见误区

初学者在学算法时每每容易陷入一些误区。好比,一开始就抱着《算法导论》如许的天书啃,大概在还没学好基本数据结构的环境下就去刷 LeetCode。这其实是不明智的,只会让自己对算法望而却步,乃至放弃。
2. 新手小白如何有效刷算法题

想要开始刷题吗?很简单:打开 LeetCode 官网,选一道顺眼的题目,然后开始刷。但是别纠结于选择哪个刷题平台。
刚刚接触算法,在学习了基本的数据结构与算法后,很多人准备开始刷题,却总想着找一个最有效、最好的刷题平台。一会儿在 LeetCode 题解区逛逛,一会儿在牛客网看看面经,效果整个人都烦躁不安,焦急迷茫。题没刷几道,羡慕妒忌恨却增加了几分:别人的代码怎么这么简洁?别人的 Offer 怎么这么亮眼?
https://img-blog.csdnimg.cn/direct/2b2f27351fb641339d9f18ca2576d97d.png#pic_center
颠末深刻的反思,我们来剖析自己刷题无效的原因:
2.1. 没有继承自己是算法小白的究竟

刚接触算法的时候,只是体系地学习了基础数据结构与算法知识,但并没有真正使用这些知识去办理题目。在刷题的过程中,总想证明自己可以,别人能写出简洁高效的解题方法,我也想!于是我不停地找题证明自己,效果却越刷越没有效果,自己根本就看不懂题目考察的数据结构与思想。整个人完全崩溃,乃至想过放弃算法面试和跳槽。
后来,告诉自己, 假如随随便便学一点就能顺利刷题,那大学四年不就白学了!所以,前期要先继承自己的思考方式,暴力解法其实也是一种有效的解法。
2.2. 没有合理的刷题方法

假如只是盲目地追求刷题的数量,即使刷了200道,脑中仍然一团浆糊。后来才明确,吃透一道题目比乱刷十道题目更有代价。
颠末不断的摸索与试验,我们形成了一套刷题路径:


[*]自己的解法
[*]网上好的解法
[*]自己的解法可以改进的地方
[*]不停的优化
[*]寻找雷同的题型重复练习
[*]总结
每一道题目都至少颠末一遍如许的迭代,彻底吃透一道题,进而掌握一种题型。按照如许的刷题路径下来,我发现自己对这类题型有了开端的思考途径,有了发力点,再也不会一筹莫展:看题懵逼半小时,Coding 只会按空格。
彻底搞懂这题后,就需要找到雷同的题型,然后不断地重复练习,好比:最小路径和、整数拆分、完全平方数、解码方法、差异路径、差异路径 II。
通过这些练习,寻找题目中的共同点,思考为什么这类题型都可以用相似的方法办理。
逐步的,掌握了最优子结构、状态转移方程、重叠子题目等概念,不知不觉间,已经掌握了动态规划知识点的80%。
再碰到更高难度的动态规划题目时,心里也明确,一时半会没做成,无非就是最优子结构、状态转移方程、重叠子题目没有理清楚。
如许长期对峙下来,接触新的题型时也就可以从容不迫地思考。
3. 正确的算法学习路径

要制止这些误区,我们需要有一个正确的算法学习路径。
3.1. 基础数据结构与算法知识

在学习算法之前,你需要先掌握一些基础的数据结构与算法知识。


[*]时间复杂度和空间复杂度:这是算法学习中必须开始掌握的概念,包括最大复杂度、平均复杂度等。你可以通过博客搜索来学习这些概念及其计算方法。
[*]线性表:包括列表(必学)、链表(必学)、跳跃表(相识原理、应用并实现)、并查集(发起结合刷题学习)。其中,链表和列表是重点,特殊是链表。
[*]栈与队列:包括栈(必学)、队列(必学)、优先队列、堆(必学)、多级反馈队列(相识原理与应用)。
[*]树:包括二叉树的各种遍历(递归与非递归,必学)、哈夫曼树与编码(相识原理与应用)、AVL树(必学)、B树与B+树(相识原理与应用)、前缀树(相识原理与应用)、红黑树(相识原理与应用)、线段树(相识原理与应用)。树相干的知识很多,发起看书学习,如《算法第四版》。
在刷题前,不需要掌握所有的数据结构,但至少要学会最基本的二叉树。
3.2. 常见算法思想

掌握了一些基础的数据结构之后,可以开始学习一些常见的算法思想。


[*]递归:这是最重要的算法思想之一,很多其他算法都会涉及到递归。因此,在学习二叉树、图相干算法等碰到递归时,希望你能静下心来学习递归。
[*]罗列:一种简单的算法思想,通过遍历所有可能的环境来找到题目标解。
[*]贪婪:一种在每一步都选择当前状态下最优的选择的算法思想。
[*]回溯:一种通过试错来找到题目标解的算法思想。
[*]动态规划:一种通过把原题目分解为相对简单的子题目标方式来求解复杂题目标算法思想。
其中,递归是最重要的算法思想之一,你必须要入门。而动态规划、回溯等可以后面刷题碰到时再学。罗列和贪婪相对比较简单。
3.3. 如何刷题

掌握了基础的数据结构和算法思想之后,你就可以开始刷题了。
3.3.1. 相识互联网算法笔

在刷题之前,我想先说一说笔试。假如笔试不考算法,面试也不考算法,那么我可能在学习算法的这条路上会少了很多的积极性。
但是,带着功利性的目标去学习算法也是完全没题目标。在校招的笔试中,这些笔试题通常都很难。你可能在 LeetCode 上能做出 hard 级别的题,但在笔试中可能连 medium 级别的都做不出。
因为笔试的题都比较机动,基本都会通过实际的例子来引出一道题。你可能不知道要使用哪种方法来做比较好,有些还是多种方法的结合。
3.3.2. 笔试的题型范例总结

(1)基本数据结构的考察:这类题我觉得是比较简单的,主要科场基本数据结构的操作,比方二叉树的层序遍历,链表的逆序等,固然,它不会直接告诉你,让你来逆序大概遍历。
(2)某种算法思想的掌握:这类题你掌握了某种算法思想,就会比较容易,假如不懂,那就凉凉了。比方动态规划、回溯、罗列、深度/广度、贪婪、二分等。其中,我觉得动态规划考的挺多,还有就是回溯+深度/广度。
(3)界限条件的考察:这范例的题,估计你一看就有思绪,知道该怎么做,但是,它的界限条件特殊多,需要分很多种环境来讨论,特殊容易出错,偶然候会让人陷进去,越做越复杂,这类题主要科场你的思维严谨水平。
(4)找规律、数学公式:这范例的题,主要是根据数据之间的一些关系,来找一些规律,进而推出他们的通用公式,就像我们高中时,找数列的同项一样。
3.3.3. 分类刷题

比方最开始可以在 LintCode 按照链表/二叉树/递归等这些标签来刷,因为如许可以让你深入掌握每一种方法。固然,笔试的题之所以难,是因为我们每每不知道用哪一种方法做好,大概说具体属于哪一种题型。
那么还有须要分类刷题吗?
答是有须要的,只有当你熟悉每一种题型,你才气机动使用他们,进而办理各类复杂的题。这就如同你在练功夫的时候,前期你需要把每个招式都打扎实了,之后才气机动把各个招式连接起来,融合贯通。刷题也是一样,前期先分类,把每个题型掌握起来,后期咱们再随机练习,逐步着就能机动应用了。
3.3.4. 阶段性总结

每次刷了一部分题型之后,还有须要做一些总结,大概说总结一些刷题模版。比方对于二分法查找,其实好几种题型总结起来,就是开闭区间的组合。你可以把他们总结起来,比方什么时候用开区间,什么时候用闭区间。
有人可能会说,模版是死的,真的有须要总结吗?我觉得有须要总结,但没须要死记。总结只是加深你的理解。固然,假如你在做题的时候,刚好记住了自己的模版,可以直接套上去,那肯定更好。
但是,就算忘了也没事,通过自己的总结,你其实是知道怎么做的了,只是还需要你多花一点时间,快速模拟讨论下各种环境,一样能够做出来的。
也就是说,最开始刷题的时候,可以分类刷题,并且阶段性总结。假如你是初学者,可以先从简单的题做起,比方一些简单的递归题,之后是一些二叉树、链表的题。因为你可能刚刚学习数据结构不久,刚好可以加深你的理解。
4. 刷题时的留意点

在刷题的过程中,你需要留意以下几点:

[*] 不要眼高手低:即使一道题看起来简单,也要动手去做。AC之后,还要去讨论区学习更优解,因为有些人的代码写得非常简洁、优雅,你可以多学一学。
[*] 追求最优解:不要满足于仅仅AC一道题。你应该实行优化你的代码,追求时间复杂度和空间复杂度的最优解。当你做一道题时,一开始可以先用暴力方法办理,但后面还得想想该如何优化。想不出也没事,可以去讨论区找空间/时间复杂度更低的代码,大概直接用搜索引擎搜索。之后跟着别人的代码自己再实现一遍,尽可能把最优解的代码实现出来。
5. 学习资料汇总及推荐

学习算法没有捷径可走:先死磕入门数据结构,然后接触一些算法思想,最后开始分类刷题。刷题就是最好的捷径了,但刷题后不要就此止步,应该尽可能寻找最优解。当你积累了一定的题量后,你会发现自己的算法能力得到了显著提升。
在书籍方面: 推荐《数据结构与算法分析:C语言形貌版》和《算法第四版》, 这两本书都黑白常好的算法入门书籍。
也可以选择《算法导论》或《数据结构与算法分析》等经典教材著作。
在视频方面: 固然,你也可以看视频学习,这看个人喜欢。我习惯先看视频,2倍速度播放,再攻书籍。 重要的是对峙学习和实践,不断提升自己的算法能力。
视频方面为大家整理好了,一些对学习算法非常有帮助的资源。假如需要的话,可以在公众号 [ 码到三十五 ] 后台回复"算法",看到后我会加你免费发送给你下载地点,。希望这些资料能够帮助你在算法工程师的道路上走得远一点点!
这是数据结构和算法的学习视频
https://img-blog.csdnimg.cn/direct/2166fc82393a45a685b236ec5bb76673.png
这是数据结构和算法的面试刷题视频
https://img-blog.csdnimg.cn/direct/c880010909904f178976f67cf7fb19c4.png
6. 絮叨一下

学习算法需要时间和耐心,但只要你对峙下去并不断积极提升自己的技能能力,就一定能够在算法工程师的道路上取得很多收货。记住,技能能力的高低决定你能走多远,而平台的高低则决定你能飞多高。所以请爱惜每一次学习的时机并积极提升自己的实力吧!无论你是初学者还是有一定履历的算法工程师,都希望你能在这条道路上不断进步、不断成长!
    关注公众号获取更多技能干货 ! https://img-blog.csdnimg.cn/direct/d8a0f829c23843419a500ccf4932b1f3.gif#pic_center

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 算法学习攻略总结 : 入门至进阶,通关之路指南