分享|不同层次的面试算法学习规划
13156
2024.07.28
2025.06.24
发布于 安徽

前言

hot100 只是出现频次相对高的一些面试题,建议参考本篇的引导把逐步把算法学好,而非单纯背题。

以下是不同层次群体的需要,后者基于前者。不想引起争议,故不给出明确的水平界限。

如果你把自己定在阶段 3,那么在学习 1 和 2 的时候应该按照 3 的难度建议,并调高习题量,但依然要从简单到困难。

有些链接为我个人写的教程,免费和付费的都有。

阶段 1

难度最高在中等难度的中等题。

  1. 一维数组、二维矩阵、字符串这些相关性质的检测。只做简单的模拟题,结合高级知识的题后面会自然遇到。可参考这个题单中的从“基础实现”到“矩阵”。
  2. 初级数据结构 (列表、链表、栈、单向队列、双向队列、哈希表)
  3. 双指针
  4. 二分查找
  5. 树(重点,与多种算法思想相关,比如 DFS, BFS)
  6. 递归、分治、回溯(基本可以抽象成树的思想来做)

阶段 2

难度最高在高等难度的中等题和高频出现的困难题。

  1. 排序
  2. 贪心
  3. 滑动窗口
  4. 一维前缀和(前缀异或放在下一小节的位运算中学)
  5. 单调栈基础
  6. 并查集
  7. 图论入门:概念 + DFS + BFS + 拓扑 + Prim + Kruskal + Dijkstra + Floyd。DFS / BFS 中先做常规题,后做网格题。
  8. 动态规划基础:入门(比如斐契那波数,爬楼梯)、线性、区间、背包基础(背包的种类很多)、状态机、树形(打家劫舍那几道题)
  9. 字典树
  10. 有序集合
  11. 会手写二叉堆、KMP 的实现(这些先学会、平时忘了没事,考前复习背一遍,不难的)
  12. 知晓高级树的基本性质(比如 B 树,B+ 树的应用场景,不要求精通)

阶段 3

难度最高在低级难度的困难题,依然以中等题为主。

  1. 二维前缀和
  2. 差分数组
  3. 位运算
  4. 单调栈模拟
  5. 动态规划进阶(普通的二维变一维优化,还有多种进阶背包比如状态压缩、博弈,但除去与下一小节知识结合的部分,比如单调队列优化)
  6. 图论中的 BellmanFord, SPFA, A 星 这几个算法,但考察频率很低,个人倾向于跳过。

阶段 4

最高难度在 Leetcode 中不限,一般是面试官没看中你然后出的劝退题,你做出来会有转机。

  1. 图论进阶 (强连通分量、基环树、网络流、二分匹配、欧拉回路)

    我的《图论进阶》没有与这些知识点完全对应,并且强连通分量被我放在了《图论入门》。

  2. 单调队列(不难,但在面试中出现得极少,便没放在以上小节中)
  3. 数学(比如最大公约数、组合数学)
  4. 线段树
  5. 树状数组
  6. 滚动哈希
  7. KMP 变形应用, Manacher 算法,Z 函数等字符串的高级技巧
  8. 树的 Morris 遍历
  9. 动态规划的多种进阶优化方式(严格来说,可能会作为 follow up,在周赛中除第四题外没写这种优化方式也能过)
  10. 贪心的各种高级技巧,非常杂,出题人用心的话也能方便提出新的 trick。

结语

  1. 如果有题没做出来或者自己解法/写法不好的时候,收藏留作二刷。

  2. 刷得差不多了把 hot 100 过一遍,这时候那里面的大多数题你应该已经做过了,没做过的也基本会。

  3. 反对散播焦虑,比如说强调某大厂考了匈牙利算法,另一大厂考了线段树优化 DP。高级知识点的范围太广,如果纯是为了面试,提升其他方面的水平更划算,比如代码可读性。算法题只是一个相对重要的环节,并不是说把所有算法题都做出来才算过,当然一题没过估计也就 G 了。

  4. 学有余力的话,可以看《算法导论》。刷题推荐在这个网站上针对难度分来刷 Leetcode 的其他题目。刷完了再去 CF, AtCoder 这些。我推荐先刷 Leetcode,虽然缺少一些高级知识点比如网络流的针对训练,但题解和测试用例都相对好。

点赞关注不迷路。祝君早日上岸,飞黄腾达!

笔者的认知范围有限,如果读者认为有些知识点需要挪动位置,或者有所遗漏,欢迎留言。

评论 (11)