大神教你LeetCode正确的刷题顺序
各种排序算法,所谓的十大经典排序算法;
二分搜索法;
线性数据结构:动态数组,链表,栈和队列;
常用的树形数据结构:二分搜索树,堆,红黑树,B 树,并查集等;
哈希表;
常用字符串算法,如 Trie 的使用,滚动哈希,KMP 等;
基础的图论算法,如图的深度优先遍历,广度优先遍历,及其应用;带权图最短路径的 Dijkstra 算法;最小生成树的 Kruskal 算法;有向图的拓扑排序;哈密尔顿回路(或者路径)等等;
一些进阶的数据结构,如线段树,后缀树,跳表,等等;
一些进阶的图论算法,如寻找桥或者割点;欧拉回路(或者路径);匈牙利算法;最大流最小割;等等。
其他算法,比如随机算法 Knuth Suffle,蓄水池抽样,等等
-
Dijkstra 和 Prim 算法蕴含着动态规划的思想; -
Kruskal 算法蕴含着贪心的思想; -
滚动哈希蕴含着双指针的思想; -
哈希表,滚动哈希,都蕴含着哈希方式的运用; -
计数排序,基数排序,桶排序,哈希表,都有对数据元素进行分类(桶)这种思想的应用; -
哈密尔顿回路(或者路径)可以使用回溯法求解,进而可以使用记忆华搜索或者动态规划做优化,这背后也包含状态压缩的思想; -
同样解决 topK 问题,使用优先队列和使用快排的改进思想,可以让我们理解在线算法和离线算法;
关于这些基础的算法和数据结构的学习,最推荐的教材,就是大名鼎鼎的《算法 4》。
说实话,这些专题的问题已经相当多了。如果都能刷完,并且每个问题认真理解了,我觉得算法面试的问题已经不大了。