前言
hot100 只是出现频次相对高的一些面试题,建议参考本篇的引导把逐步把算法学好,而非单纯背题。
以下是不同层次群体的需要,后者基于前者。不想引起争议,故不给出明确的水平界限。
如果你把自己定在阶段 3,那么在学习 1 和 2 的时候应该按照 3 的难度建议,并调高习题量,但依然要从简单到困难。
有些链接为我个人写的教程,免费和付费的都有。
阶段 1
难度最高在中等难度的中等题。
- 一维数组、二维矩阵、字符串这些相关性质的检测。只做简单的模拟题,结合高级知识的题后面会自然遇到。可参考这个题单中的从“基础实现”到“矩阵”。
- 初级数据结构 (列表、链表、栈、单向队列、双向队列、哈希表)
- 双指针
- 二分查找
- 堆
- 树(重点,与多种算法思想相关,比如 DFS, BFS)
- 递归、分治、回溯(基本可以抽象成树的思想来做)
阶段 2
难度最高在高等难度的中等题和高频出现的困难题。
- 排序
- 贪心
- 滑动窗口
- 一维前缀和(前缀异或放在下一小节的位运算中学)
- 单调栈基础
- 并查集
- 图论入门:概念 + DFS + BFS + 拓扑 + Prim + Kruskal + Dijkstra + Floyd。DFS / BFS 中先做常规题,后做网格题。
- 动态规划基础:入门(比如斐契那波数,爬楼梯)、线性、区间、背包基础(背包的种类很多)、状态机、树形(打家劫舍那几道题)
- 字典树
- 有序集合
- 会手写二叉堆、KMP 的实现(这些先学会、平时忘了没事,考前复习背一遍,不难的)
- 知晓高级树的基本性质(比如 B 树,B+ 树的应用场景,不要求精通)
阶段 3
难度最高在低级难度的困难题,依然以中等题为主。
- 二维前缀和
- 差分数组
- 位运算
- 单调栈模拟
- 动态规划进阶(普通的二维变一维优化,还有多种进阶背包比如状态压缩、博弈,但除去与下一小节知识结合的部分,比如单调队列优化)
- 图论中的 BellmanFord, SPFA, A 星 这几个算法,但考察频率很低,个人倾向于跳过。
阶段 4
最高难度在 Leetcode 中不限,一般是面试官没看中你然后出的劝退题,你做出来会有转机。
- 图论进阶 (强连通分量、基环树、网络流、二分匹配、欧拉回路)
我的《图论进阶》没有与这些知识点完全对应,并且强连通分量被我放在了《图论入门》。
- 单调队列(不难,但在面试中出现得极少,便没放在以上小节中)
- 数学(比如最大公约数、组合数学)
- 线段树
- 树状数组
- 滚动哈希
- KMP 变形应用, Manacher 算法,Z 函数等字符串的高级技巧
- 树的 Morris 遍历
- 动态规划的多种进阶优化方式(严格来说,可能会作为 follow up,在周赛中除第四题外没写这种优化方式也能过)
- 贪心的各种高级技巧,非常杂,出题人用心的话也能方便提出新的 trick。
结语
-
如果有题没做出来或者自己解法/写法不好的时候,收藏留作二刷。
-
刷得差不多了把 hot 100 过一遍,这时候那里面的大多数题你应该已经做过了,没做过的也基本会。
-
反对散播焦虑,比如说强调某大厂考了匈牙利算法,另一大厂考了线段树优化 DP。高级知识点的范围太广,如果纯是为了面试,提升其他方面的水平更划算,比如代码可读性。算法题只是一个相对重要的环节,并不是说把所有算法题都做出来才算过,当然一题没过估计也就 G 了。
-
学有余力的话,可以看《算法导论》。刷题推荐在这个网站上针对难度分来刷 Leetcode 的其他题目。刷完了再去 CF, AtCoder 这些。我推荐先刷 Leetcode,虽然缺少一些高级知识点比如网络流的针对训练,但题解和测试用例都相对好。
点赞关注不迷路。祝君早日上岸,飞黄腾达!
笔者的认知范围有限,如果读者认为有些知识点需要挪动位置,或者有所遗漏,欢迎留言。