速成学习规划
有些读者跟我反馈:本站的内容确实够扎实了,如果认真学习,必然可以彻底掌握数据结构和算法,但是问题是他们现在的问题是没有那么多时间,何解?
能不能抓大放小,先把必知必会的技巧学会,临阵磨一下枪,日后有时间再慢慢学习?
我觉得这确实是相当一部分读者的需求,所以专门写了这个速成版的目录,满足这部分读者的诉求。
速成目录必然不可能做到面面俱到,所以如果你时间充裕,我还是建议按照 主站目录 顺序学习。
在开始之前,可以先花两分钟看看 算法可视化面板使用说明 的第一部分,了解可视化面板的基本使用方法。因为所有题目的解法都配有可视化,如有需要可以借助可视化面板进行调试和验证。
关于建议用时
下面对每篇文章的建议用时是一个偏大的粗略的估计,假设读者时间并不充裕,每天只花碎片化的 1~2 小时左右的时间学习。
所以这个建议用时仅供参考,具体的学习时间会根据每个人有所差异。如果能够花整块的完整时间学习,速度会快很多。
另外,速成读者不需要过度死磕。有些知识点你一时理解不了,记录一下暂时跳过就行了。等整个知识体系建立起来回头来看,很多问题自然就迎刃而解了。
速成目录主要分「数据结构」部分和「算法刷题」部分。数据结构部分基本不涉及算法题,相对较简单;刷题部分是重点,一定要认真思考,亲自动手实践。
数据结构
数组链表
介绍基本的数组链表概念,比较简单。主要是环形数组这个技巧是重点,可以用 的时间复杂度在数组头部进行插入删除操作。
建议用时 1 天
哈希表原理及应用
作为速成教程,我们可以跳过哈希表的两种解决哈希冲突的代码实现,但是哈希表的原理是必须掌握的。
哈希表可以和数组、双链表进行结合,形成更强大的数据结构 LinkedHashMap
和 ArrayHashMap
,它们可以给哈希表增加新的特性,需要了解其中的原理。
二叉树基础及遍历
虽然现在只是基础知识章节,但是二叉树部分必须重视起来,尤其是二叉树的遍历,是入门递归思维关键。后面开始刷题后,所有递归算法的本质上都是二叉树的遍历。
二叉堆结构也放在这里,二叉堆的关键应用是优先级队列。作为速成教程,我们可以跳过优先级队列的实现,但是要理解以下关键点:
1、优先级队列是一种能够自动排序的数据结构,增删元素的复杂度是 ,底层使用二叉堆实现。
2、二叉堆是一种拥有特殊性质的完全二叉树。
3、优先级队列(二叉堆)的核心方法是 swim, sink
,用来维护二叉堆的性质。
建议用时 1 天
图结构
图论算法时一个很大的话题,但是作为数据结构基础章节,我们目前只需要了解图的逻辑表示和具体实现,以及图的遍历算法。
其实也不算复杂,本质上还是前文二叉树结构的延伸。
建议用时 1 天
开始刷题
现在开始刷题,先了解力扣刷题的基本规则。
链表
数组相关的题目套路比较固定,主要是双指针技巧。
建议用时 1~2 天
单链表的一个进阶技巧是递归操作单链表,不过这种思路一般用于面试时说一下就行,笔试时就用标准的指针操作即可。
建议用时 1~2 天
数组
数组相关的技巧也主要是双指针,只不过可以分为快慢指针、左右指针几种不同的类型。经典的数组双指针算法有二分搜索、滑动窗口。
有些读者问我为什么不出字符串算法的专题,因为字符串就是字符数组,字符串算法本质上还是数组算法。
建议用时 2 天
建议用时 2 天
建议用时 1~2 天
建议用时 1~2 天
队列/栈
队列和栈本身是比较简单的数据结构,但是它们在算法题中的运用需要专门练习。
单调栈和单调队列是基于栈和队列的两种变体,它们能够解决一些特殊的问题,需要掌握。
二叉树
所有递归算法的本质上都是二叉树的遍历,而且二叉树算法经常出现在面试/笔试中,所以二叉树章节我多放几篇文章,希望大家认真学习理解,亲自动手实践。
建议用时 1 天
这篇核心纲领是一个总纲,里面会从二叉树的角度介绍回溯/动态规划等算法,你只要有个印象就行了,不需要完全理解,等到后面学习了回溯/动态规划再回来看就会有更深的理解。
建议用时 2~3 天
建议用时 1~2 天
二叉搜索树
二叉搜索树是特殊的二叉树,你就记住它的特点是「左小右大」,好好利用这个特点,来优化二叉树的遍历过程。
建议用时 1~2 天
建议用时 1~2 天
数据结构设计
LRU 和 LFU 是经典的数据结构设计问题,必须掌握。
建议用时 2~3 天
这个计算器的文章是一个经典的数据结构设计题目。没时间仔细阅读的话,可以把最后给出的计算器代码保存下来,如果笔试遇到字符串计算相关的题目,可以直接复制粘贴拿去用。
建议用时 2~3 天
图算法
环检测、拓扑排序、二分图判定是经典的图算法,本质上就是对图的遍历,并不难掌握。
建议用时 1~2 天
Union Find 算法是比较实用的图算法,你需要大致了解它的原理和 API。如果没有时间仔细阅读,可以把最后给出的 UF
类保存下来,笔试时可以直接拿去用。
建议用时 1 天
最小生成树的原理需要掌握,Kruskal 算法可以了解下,因为他比较简单,其实就是 Union Find 算法 + 排序。
建议用时 1 天
Dijkstra 最短路径算法属于经典图论算法,需要掌握,可以把模板保存下来,笔试时可以快速运用。
建议用时 1 天
DFS/回溯算法
回溯算法是一种纯粹的暴力穷举算法,必须掌握。
因为笔试时是按照通过的测试用例数量来算分的,如果有些题目你实在写不出最优解,写一个回溯算法暴力穷举一下,虽然过不了所有测试用例,但是能过一部分,也能捞到一点分数。
建议用时 2~3 天
建议用时 2~3 天
建议用时 1 天
在时间允许的条件下,如果你觉得不尽兴,可以快速过一下回溯算法的习题来巩固回溯算法框架:
BFS
BFS 也是一种暴力穷举算法,必须掌握。只不过它是按层遍历的,适合解决最短路径问题。
建议用时 1~2 天
在时间允许的条件下,如果你觉得不尽兴,可以快速过一下 BFS 算法的习题来巩固回溯算法框架:
动态规划
动态规划本质上也是暴力穷举,只不过有些问题的穷举过程中存在重叠子问题,所以可以通过备忘录进行优化,对于这类算法,我们通常称为动态规划算法。
动态规划的暴力穷举解法一般是递归形式,优化方法非常固定,要么就是添加备忘录,要么就是改写成迭代形式。
动态规划的难点在于那个暴力解(状态转移方程)怎么写,请你阅读下面的文章,尤其注意得到状态转移方程的思维过程。
建议用时 1~2 天
建议用时 1~2 天
建议用时 1~2 天
贪心算法
一般的算法问题,需要暴力穷举所有解,从中找到最优解。
而有些算法问题,如果你充分利用信息,不需要用暴力穷举所有解,就能找到最优解,这就叫贪心选择性质,这种算法叫贪心算法。
所以贪心算法没有固定的套路,它的关键在于细心观察,看看是否能够充分利用信息,提前排除一些不可能是最优解的情况。
建议用时 1~2 天
建议用时 1~2 天
数学
一般笔试中数学相关算法比较少,不过一些经典的技巧还是有必要掌握。
建议用时 1~2 天
建议用时 1 天
其他经典面试题
这里列出一些经典算法题,它们本质上都是上面介绍的算法的运用。掌握了上面的所有算法后,一般的面试题你应该都能够解决了。
建议用时 1~2 天
建议用时 1~2 天