返回文章列表
数据结构与算法
算法数据结构学习路线

数据结构与算法学习路线总览

这是「数据结构与算法」系列的开篇文章。在正式刷题之前,先把整条路线的全貌讲清楚:为什么学、按什么顺序学、每个专题解决什么问题,以及怎么配合 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 刷题

只看笔记不动手,等于没学。推荐用"一个专题一个循环"的节奏:

  1. 先读笔记建立框架:看本系列对应专题的文章,理解核心概念和模板代码的写法。不求一次全懂,知道套路长什么样即可。
  2. 按题单顺序刷:每个专题都配了对应的 LeetCode 题单(在各篇文章末尾)。前两三题允许看题解,之后尽量独立完成,实在卡住 20 分钟再看关键提示。
  3. 写完复盘边界:AC 不代表结束。关掉题解,用自己的话说一遍:循环条件为什么这么定、边界怎么处理、复杂度是多少。说不清楚就再模拟一遍。
  4. 标记待复习题:一遍没做出来的题做好标记,专题刷完后再从头过一遍标记题。间隔一天以上还能独立写出,才算真的掌握。

关于刷题姿势的三个建议:

  • 用固定语言。本系列示例统一用 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 对应题号。

下一篇进入算法基础专题导读,先聊聊复杂度分析为什么是一切优化的起点。

参考