数据结构与算法学习路线总览
这是「数据结构与算法」系列的开篇文章。在正式刷题之前,先把整条路线的全貌讲清楚:为什么学、按什么顺序学、每个专题解决什么问题,以及怎么配合 LeetCode 高效训练。后续每一篇都会沿着这条路线展开。
为什么要系统学习数据结构与算法
很多人把刷题当成面试前的突击,背几道高频题就上场。短期也许能过,但遇到没见过的题就露馅了。系统学习的价值体现在两个层面:
面试层面:国内一线公司的手撕代码环节,考察的几乎都是 LeetCode 中等难度级别的题。面试官在意的不只是"做出来",还有你能不能说清楚复杂度、有没有分析边界的习惯。这些能力只能靠体系化的训练积累。
工程层面:写 Java 后端代码时,选择 ArrayList 还是 LinkedList、用 HashMap 还是 TreeMap、能不能用前缀和把 O(n²) 降到 O(n),这些判断每天都会遇到。理解数据结构的底层特性,才能写出性能靠谱的代码。
一句话总结:数据结构决定"东西怎么放",算法决定"东西怎么取怎么算",两者合起来决定了程序的性能上限。
13 大专题推荐学习顺序
下面这张总表是整个系列的骨架。顺序不是随便排的:前面的专题是后面专题的地基,跳着学容易处处碰壁。
| 顺序 | 专题 | 一句话定位 | 前置知识 |
|---|---|---|---|
| 1 | 算法基础 | 学会衡量算法好坏:时间/空间复杂度、递归性能 | 无(Java 基本语法) |
| 2 | 数组 | 掌握二分、双指针、滑动窗口、前缀和、模拟五大基础套路 | 算法基础 |
| 3 | 链表 | 训练指针操作:虚拟头结点、反转、快慢指针判环 | 数组(双指针思想) |
| 4 | 哈希表 | 快速判断"有没有出现过",统计频率与建立映射 | 数组、链表 |
| 5 | 字符串 | 原地修改、反转、KMP 模式匹配 | 数组、双指针 |
| 6 | 双指针法 | 把散落在各题里的双指针技巧收拢成方法论 | 数组、链表、哈希表 |
| 7 | 栈与队列 | 括号匹配、表达式求值、单调队列、优先队列 | 数组 |
| 8 | 二叉树 | 系统学习递归与迭代遍历,是回溯和 DP 的思维地基 | 栈与队列、递归 |
| 9 | 回溯算法 | 用统一的搜索树模型解决组合、切割、子集、排列 | 二叉树(递归功底) |
| 10 | 贪心算法 | 从局部最优推导全局最优,重点在"想清楚为什么对" | 排序、双指针 |
| 11 | 动态规划 | 从状态定义和转移方程入手,覆盖背包、子序列等模型 | 递归、回溯 |
| 12 | 单调栈 | 求两侧第一个更大/更小元素,温度、柱状图、接雨水的核心 | 栈 |
| 13 | 图论 | DFS、BFS、并查集、拓扑排序、最短路 | 二叉树遍历、队列、栈 |
其中数组、二叉树、动态规划三个专题的体量最大,值得单独展开子路线:
- 数组:二分查找 → 移除元素 → 有序数组平方 → 长度最小子数组 → 螺旋矩阵 II → 前缀和。这是"一个知识点配一类模板"的标准编排,学完它你对"区间"和"指针"会有肌肉记忆。
- 二叉树:先学四种遍历的递归与迭代写法,再学属性计算(深度、路径、对称),然后是修改与构造、BST 特性、公共祖先。顺序别乱,后一步完全依赖前一步的递归手感。
- 动态规划:基础五部曲(状态定义、转移方程、初始化、遍历顺序、打印验证)→ 背包(01 背包打头,完全背包、多重背包跟进)→ 打家劫舍 → 股票系列 → 子序列 → 回文。每个子系列建议间隔一天复盘标记题。
几点补充说明:
- 算法基础可以后置。如果你是完全没接触过算法的新手,第一遍可以先跳过复杂度分析的细节,直接从数组开始找感觉,回头再补。但这部分内容刷题前最好过一遍,至少知道 O(n) 和 O(n²) 差在哪。
- 二叉树是分水岭。从二叉树开始,题目从"线性结构上的技巧"变成"递归结构上的思维",很多人卡在这里。把它的 20 来道基础题老老实实做完,后面的回溯和 DP 会顺很多。
- 动态规划要给足时间。它不是技巧题而是思维题,指望一周速成不现实。建议按"基础 DP → 背包 → 打家劫舍 → 股票 → 子序列 → 回文"的子路线推进,每个子系列集中刷完再换下一个。
如何配合 LeetCode 刷题
只看笔记不动手,等于没学。推荐用"一个专题一个循环"的节奏:
- 先读笔记建立框架:看本系列对应专题的文章,理解核心概念和模板代码的写法。不求一次全懂,知道套路长什么样即可。
- 按题单顺序刷:每个专题都配了对应的 LeetCode 题单(在各篇文章末尾)。前两三题允许看题解,之后尽量独立完成,实在卡住 20 分钟再看关键提示。
- 写完复盘边界:AC 不代表结束。关掉题解,用自己的话说一遍:循环条件为什么这么定、边界怎么处理、复杂度是多少。说不清楚就再模拟一遍。
- 标记待复习题:一遍没做出来的题做好标记,专题刷完后再从头过一遍标记题。间隔一天以上还能独立写出,才算真的掌握。
关于刷题姿势的三个建议:
- 用固定语言。本系列示例统一用 Java。语言换来换去会分散精力,先把一种语言的库函数和集合类用熟。
- 第一遍追求理解而非速度。宁可一天吃透两道题,也不要一天"过"十道题。第二遍复习时再练手速。
- 别陷入收集题解。收藏夹里的一百篇题解不如纸上推过的十个递归树。做一道消化一道。
学习节奏与阶段里程碑
按每天 1~2 小时估算,整条路线大致的进度参考(仅供量级感知,别拿它当 KPI):
| 阶段 | 专题范围 | 建议时长 | 里程碑检验 |
|---|---|---|---|
| 一 | 算法基础 + 数组 | 2~3 周 | 能默写二分与滑窗模板,能逐行分析复杂度 |
| 二 | 链表 + 哈希表 + 字符串 | 3 周 | 反转链表与判环闭眼写;560 类题独立完成 |
| 三 | 双指针 + 栈与队列 + 二叉树 | 4 周 | 二叉树 20+ 题全标记清零 |
| 四 | 回溯 + 贪心 | 3 周 | 能画出回溯搜索树并剪枝 |
| 五 | 动态规划 | 5~6 周 | 背包与子序列各子系列独立通关 |
| 六 | 单调栈 + 图论 + 复习 | 3~4 周 | Hot100 正确率 80% 以上 |
三到四个月走完是正常速度。中断一周以上再回来,从当前专题的第一道标记题热身,不要从头重学。
常见疑问
问:需要先修完《算法导论》这类教材吗? 不需要。本路线面向刷题与工程实用,用到什么补什么。教材可以作为某个专题卡壳时的查阅资料,不适合作为前置条件。
问:要不要背模板? 要,但背的前提是理解。模板是"想清楚了才写得出"的产物:先能白板推导出二分的边界处理,再谈默写。只背不理解,题目稍一变形就废。
问:一道题卡住多久该看题解? 建议 20~30 分钟。超过就先看思路提示(不看点代码),合上题解自己实现;若仍写不出,再看完整实现并标记重做。
问:用 Java 刷题会不会太啰嗦? Java 的集合库(HashMap、ArrayDeque、PriorityQueue)对算法题非常友好,代码量并不吃亏。工程背景读者继续用 Java 反而能顺带加深对集合类底层的理解。
本系列文章导航
组 A(总览 + 算法基础 + 数组专题)的篇目如下,后续专题的篇目会在对应系列中持续更新:
| 文章 | 主题 | 对应专题 |
|---|---|---|
| 数据结构与算法学习路线总览(本篇) | 全系列路线与导航 | 总览 |
| 算法基础专题导读 | 专题内容概览与学习方法 | 算法基础 |
| 时间与空间复杂度:衡量算法的尺子 | 大 O 记号、均摊分析、逐行分析示范 | 算法基础 |
| 递归的性能陷阱与调用栈 | 递归三要素、StackOverflowError、记忆化 | 算法基础 |
| 数组专题导读 | 数组特性与知识地图 | 数组 |
| 二分查找:循环不变量与边界 | 两套区间写法、防溢出、边界查找 | 数组 |
| 滑动窗口与前缀和 | 303/560/209/76 的模板与适用条件 | 数组 |
| 数组原地操作:快慢指针与模拟 | 27/283/977/59 的原地技巧 | 数组 |
后续组 B、组 C 将覆盖链表、哈希表、字符串、栈与队列、二叉树、回溯、贪心、动态规划等专题,本表会随更新扩展。
小结
- 学习顺序:算法基础 → 数组 → 链表 → 哈希表 → 字符串 → 双指针 → 栈与队列 → 二叉树 → 回溯 → 贪心 → 动态规划 → 单调栈 → 图论。
- 刷题节奏:先读笔记建框架,再按题单刷,写完必须复盘边界与复杂度。
- 二叉树是思维分水岭,动态规划需要长期投入,这两块别赶进度。
- 本系列示例代码统一用 Java,题单指向 LeetCode 对应题号。
下一篇进入算法基础专题导读,先聊聊复杂度分析为什么是一切优化的起点。