07-00 算法与数据结构 · 总目录
本目录覆盖算法与数据结构的 22 个核心专题,从基础到进阶,配合完整的模板、题目和练习路线。
学习路径
入门阶段(打基础): → 01 数组与字符串 → 02 链表 → 03 栈与队列 → 04 哈希表 核心阶段(掌握模式): → 05 树与二叉树 → 06 图论 → 07 排序算法 → 08 二分查找 进阶阶段(组合技巧): → 09 双指针与滑动窗口 → 10 递归与回溯 → 11 动态规划-基础 高阶阶段(竞赛/面试压轴): → 12 动态规划-进阶 → 13 贪心算法 → 14 分治算法 → 15 位运算 → 16 数学与高级数据结构 → 17 线段树与树状数组 → 18 最小生成树与网络流 → 19 模拟与构造算法 → 20 字符串算法专题 → 21 数据结构设计模式文章索引
| 编号 | 文件 | 核心内容 | 关键算法/技巧 | 难度 |
|---|---|---|---|---|
| 01 | 数组与字符串 | 前缀和、差分、字符串匹配 | 前缀和、差分数组、中心扩展、Manacher、KMP、原地哈希 | ★★★ |
| 02 | 链表 | 指针操作、缓存设计 | 虚拟头节点、快慢指针、反转链表、LRU、归并排序 | ★★ |
| 03 | 栈与队列 | 单调性、嵌套处理 | 单调栈、单调队列、表达式求值、最小栈 | ★★★ |
| 04 | 哈希表 | O(1) 查找、去重、缓存 | 查找配对、频率统计、滑动窗口+Map、布隆过滤器、LFU 缓存 | ★★ |
| 05 | 树与二叉树 | 遍历、BST、平衡树 | DFS/BFS 遍历、BST 操作、AVL/红黑树、线段树、哈夫曼树 | ★★★ |
| 06 | 图论 | 遍历、最短路径、连通性 | BFS/DFS、Dijkstra、拓扑排序、并查集、二分图、Tarjan、网格DFS | ★★★★ |
| 07 | 排序算法 | 9 大排序、稳定性 | 冒泡/选择/插入、归并/快排/堆排、计数/桶/基数 | ★★ |
| 08 | 二分查找 | 有序查找、二分答案 | 标准二分、边界二分、旋转数组、二分答案 | ★★ |
| 09 | 双指针与滑动窗口 | 对撞指针、窗口技巧 | 对撞双指针、快慢指针、固定/可变窗口 | ★★ |
| 10 | 递归与回溯 | 穷举搜索、排列组合 | 递归三要素、排列/组合/子集、N 皇后、迷宫问题 | ★★★ |
| 11 | 动态规划-基础 | 一维/二维 DP | 背包、LCS、LIS、编辑距离、股票买卖 | ★★★★ |
| 12 | 动态规划-进阶 | 区间/树形/状压 DP | 区间 DP、树形 DP、状压 DP、数位 DP、单调队列优化 DP | ★★★★★ |
| 13 | 贪心算法 | 局部最优推导全局 | 区间调度、霍夫曼编码、Jump Game、任务调度 | ★★★ |
| 14 | 分治算法 | 大问题分而治之 | 归并/快排分治、大数乘法、最近点对、Strassen | ★★★ |
| 15 | 位运算 | 位操作技巧 | 位操作基础、位运算优化、位掩码、快速幂 | ★★ |
| 16 | 数学与高级数据结构 | 数论、Trie、博弈论 | 数论基础、组合数学、Trie 字典树、博弈论、跳表、B+ 树 | ★★★★ |
| 17 | 线段树与树状数组 | 区间查询/更新 | 线段树、Lazy 标记、树状数组、逆序对 | ★★★★ |
| 18 | 最小生成树与网络流 | MST、最短路、最大流 | Kruskal/Prim、Bellman-Ford/SPFA、Edmonds-Karp/Dinic | ★★★★★ |
| 19 | 模拟与构造算法 | 直接模拟、构造解 | 方向数组、边界收缩、贪心构造、分治构造 | ★★★ |
| 20 | 字符串算法专题 | AC 自动机、字符串哈希、后缀数组 | AC 自动机、Rabin-Karp、后缀数组+LCP、Z-Algorithm | ★★★★ |
| 21 | 数据结构设计模式 | 区间合并、堆操作、设计模式 | 区间合并、Top K 堆、双堆中位数、K 路合并、懒删除堆 | ★★★ |
知识点速查
数组与字符串(01)
| 知识点 | 复杂度 | 代表题 |
|---|---|---|
| 前缀和 | O(n) 预处理, O(1) 查询 | LC560 |
| 差分数组 | O(1) 修改, O(n) 还原 | LC1109 |
| 最长回文子串(中心扩展) | O(n²) time, O(1) space | LC5 |
| 最长回文子串(Manacher) | O(n) time, O(n) space | LC5 |
| KMP 字符串匹配 | O(n+m) time, O(m) space | LC28, LC459 |
| 原地哈希(Cyclic Sort) | O(n) time, O(1) space | LC41 |
链表(02)
| 知识点 | 复杂度 | 代表题 |
|---|---|---|
| 虚拟头节点 | O(n) time, O(1) space | LC19, LC82 |
| 快慢指针(Floyd 判圈) | O(n) time, O(1) space | LC141, LC142 |
| Floyd 判圈数学证明 | O(n) time, O(1) space | LC142 环入口 |
| 反转链表(迭代/递归) | O(n) time, O(1)/O(n) space | LC206, LC25 |
| LRU 缓存(HashMap + 双向链表) | O(1) time | LC146 |
| 链表归并排序 | O(n log n) time | LC148 |
栈与队列(03)
| 知识点 | 复杂度 | 代表题 |
|---|---|---|
| 单调栈(下一个更大元素) | O(n) time | LC739, LC84 |
| 单调队列(滑动窗口最值) | O(n) time | LC239 |
| 双栈(表达式求值/嵌套解码) | O(n) time | LC150, LC394 |
| 最小栈(辅助栈) | O(1) time | LC155 |
哈希表(04)
| 知识点 | 复杂度 | 代表题 |
|---|---|---|
| 查找配对(complement) | O(n) time | LC1 |
| 频率统计 | O(n) time | LC49, LC242 |
| 滑动窗口 + Map | O(n) time | LC3, LC76 |
| 前缀和 + Map | O(n) time | LC560 |
| 摩尔投票(找众数) | O(n) time, O(1) space | LC169, LC229 |
| 布隆过滤器 | O(k) time | 分布式场景 |
| LFU 缓存 | O(1) time | LC460 |
树与图(05-06)
| 知识点 | 复杂度 | 代表题 |
|---|---|---|
| 二叉树遍历(前/中/后/层序) | O(n) time | LC94, LC102 |
| Morris 遍历(O(1) 空间) | O(n) time, O(1) space | LC94 优化版 |
| BST 查找/插入/删除 | O(log n) avg | LC701, LC450 |
| 平衡二叉树判断 | O(n) time | LC110 |
| 二叉树直径 | O(n) time | LC543 |
| 路径总和 III(前缀和) | O(n) time | LC437 |
| Dijkstra 最短路径 | O((V+E) log V) | LC743 |
| Bellman-Ford/SPFA(负权边) | O(V×E)/O(kE) | LC787 |
| 拓扑排序(Kahn 算法) | O(V+E) time | LC207, LC210 |
| 二分图判断(染色法) | O(V+E) time | LC785 |
| 网格 DFS/BFS(岛屿系列) | O(m×n) time | LC200, LC695 |
| Tarjan 算法(桥/割点) | O(V+E) time | 关键边、网络脆弱点 |
| 欧拉路径(Hierholzer) | O(E log E) | LC332 |
| 并查集(路径压缩+按秩合并) | O(α(n)) ~ O(1) | LC684, LC323 |
排序与二分(07-08)
| 知识点 | 复杂度 | 代表题 |
|---|---|---|
| 快速排序(随机化 pivot) | O(n log n) avg | LC912 |
| 归并排序 | O(n log n) worst | LC148 |
| 堆排序 | O(n log n) worst, O(1) space | LC215 |
| 希尔排序(Knuth 序列) | O(n^(3/2)) | 概念+实现 |
| K 路归并(外部排序) | O(n log k) | LC23 |
| 逆序对(归并变形) | O(n log n) | 剑指 Offer 51 |
| 标准二分查找 | O(log n) time | LC704 |
| 二分答案 | O(log(range) × check) | LC410, LC875 |
| 三分查找(单峰最值) | O(log(range)) | 几何优化 |
| 实数精度二分 | O(log(1/eps)) | POJ 1064 |
双指针与回溯(09-10)
| 知识点 | 复杂度 | 代表题 |
|---|---|---|
| 对撞双指针(有序数组) | O(n) time | LC15, LC11 |
| 快慢指针(链表) | O(n) time | LC141, LC160 |
| 可变窗口滑动 | O(n) time | LC209 |
| 排列/组合/子集(回溯) | O(2^n) ~ O(n!) | LC46, LC77, LC78 |
| N 皇后 | O(n!) time | LC51 |
| 解数独 | O(9^(n×n)) 剪枝优 | LC37 |
| 单词搜索(网格回溯) | O(mn×4^L) | LC79 |
| 记忆化搜索 | O(state×action) | Top-Down DP |
动态规划(11-12)
| 知识点 | 复杂度 | 代表题 |
|---|---|---|
| 一维 DP(爬楼梯/打家劫舍) | O(n) time | LC70, LC198 |
| Kadane 算法(最大子数组和) | O(n) time, O(1) space | LC53 |
| 网格 DP(路径/最小和) | O(m×n) time | LC62, LC64 |
| 博弈 DP(净胜分) | O(n²) time | LC877 |
| 二维 DP(LCS/编辑距离) | O(m×n) time | LC1143, LC72 |
| 背包问题(0-1/完全/多重) | O(n×W) time | LC416, LC322 |
| 区间 DP(石子合并) | O(n³) time | LC312 |
| 树形 DP(二叉树最大路径) | O(n) time | LC124 |
| 状压 DP(旅行商问题) | O(n² × 2^n) time | LC1879 |
| 数位 DP | O(log n × state) | LC357, LC233 |
| DAG 上的 DP | O(V+E) time | LIS 本质 |
| 单调队列优化 DP | O(n) time | LC1425, LC862 |
| 斜率优化 DP(概念) | O(n) time | 竞赛级优化 |
| 单调队列优化 DP | O(n) time | LC1425, LC862 |
其他(13-19)
| 知识点 | 复杂度 | 代表题 |
|---|---|---|
| 贪心(区间调度) | O(n log n) | LC435 |
| 贪心(分发糖果-两次扫描) | O(n) time | LC135 |
| 分治(最近点对) | O(n log n) | 经典算法 |
| 分治(Karatsuba 大数乘法) | O(n^1.585) | 概念+实现 |
| 位运算(只出现一次的数字) | O(n) time, O(1) space | LC136, LC260 |
| 格雷编码 | O(2^n) time | LC89 |
| BitSet/布隆过滤器 | O(1) time | 大数据去重 |
| Trie 字典树 | O(L) 插入/查询 | LC208, LC211 |
| 数论(扩展欧几里得/逆元) | O(log n) | 线性同余方程 |
| 快速幂取模 | O(log n) | LC372 |
| 卡特兰数 | O(n²) 递推 | LC96, LC22 |
| 线段树(Lazy 标记) | O(log n) 查询/更新 | LC307, LC699 |
| 树状数组(BIT) | O(log n) 更新/查询 | LC315, LC493 |
| MST(Kruskal/Prim) | O(E log E) / O(E log V) | LC1584 |
| 网络流(Edmonds-Karp) | O(VE²) | 最大流最小割 |
| 模拟(螺旋矩阵) | O(m×n) time | LC54, LC59 |
| 构造(漂亮数组) | O(n log n) 分治 | LC932 |
| AC 自动机(多模式匹配) | O(N+M) time | 多模式串匹配 |
| 字符串哈希(Rabin-Karp) | O(N) 预处理, O(1) 比较 | LC1044 |
| 后缀数组(SA+LCP) | O(N log N) 构建 | 最长重复子串 |
| Z-Algorithm | O(N) time | LC1392, LC459 |
| 博弈论(Bash/Nim/SG) | O(n) 时间判断 | LC292, LC877 |
| 区间合并 | O(N log N) time | LC56, LC57 |
| Top K 堆 | O(N log K) time | LC215, LC347 |
| 双堆找中位数 | O(log N) 插入, O(1) 查询 | LC295 |
| K 路合并 | O(N log K) time | LC23 |
面试高频 TOP 20
| 排名 | 题目 | 分类 | 核心技巧 |
|---|---|---|---|
| 1 | LC1 两数之和 | 哈希表 | HashMap 查找配对 |
| 2 | LC206 反转链表 | 链表 | 三指针迭代 |
| 3 | LC21 合并两个有序链表 | 链表 | 虚拟头节点 + 归并 |
| 4 | LC53 最大子数组和 | 数组 | Kadane 算法 |
| 5 | LC15 三数之和 | 数组/双指针 | 排序 + 双指针 |
| 6 | LC20 有效的括号 | 栈 | 栈匹配 |
| 7 | LC76 最小覆盖子串 | 滑动窗口 | need[] + required 计数 |
| 8 | LC200 岛屿数量 | 图论 | DFS/BFS 淹没 |
| 9 | LC146 LRU 缓存 | 链表/哈希表 | HashMap + 双向链表 |
| 10 | LC239 滑动窗口最大值 | 单调队列 | 单调递减队列 |
| 11 | LC169 多数元素 | 摩尔投票 | 互相抵消 |
| 12 | LC560 和为 K 的子数组 | 前缀和 | presum + HashMap |
| 13 | LC739 每日温度 | 单调栈 | 单调递减栈 |
| 14 | LC42 接雨水 | 双指针 | 维护左右最大值 |
| 15 | LC84 柱状图最大矩形 | 单调栈 | 左右边界查找 |
| 16 | LC322 零钱兑换 | DP | 完全背包 |
| 17 | LC300 最长递增子序列 | DP | LIS + 二分优化 |
| 18 | LC1143 最长公共子序列 | DP | 二维 DP |
| 19 | LC312 戳气球 | DP | 区间 DP |
| 20 | LC124 二叉树最大路径和 | 树形 DP | 后序遍历 |
| 21 | LC25 K 个一组翻转链表 | 链表 | 分组反转 |
算法复杂度基准
| 复杂度 | 适用规模 | 典型算法 |
|---|---|---|
| O(1) | 无限制 | 哈希表查找、位运算 |
| O(log n) | n ≤ 10^18 | 二分查找、快速幂 |
| O(n) | n ≤ 10^7 | 线性扫描、KMP、双指针 |
| O(n log n) | n ≤ 10^6 | 排序、归并、Dijkstra |
| O(n²) | n ≤ 5000 | DP 二维表、暴力双指针 |
| O(n³) | n ≤ 500 | 区间 DP、Floyd |
| O(2^n) | n ≤ 25 | 状态压缩 DP |
| O(n!) | n ≤ 12 | 全排列、N 皇后 |