数据结构 📦 一、线性数据结构 1. 数组与字符串 2. 链表(Linked List) 3. 栈(Stack) 4. 队列(Queue) 🌲 二、树形结构 1. 二叉树(Binary Tree) 2. 特殊二叉树 3. N 叉树、K 叉树 🔗 三、图结构(Graph) 📊 四、堆与优先队列 🔎 五、查找结构 📐 六、区间与线性结构扩展 📈 七、特殊结构/技巧 🧠 八、用于建模或模拟的辅助结构 🧩 九、组合结构(组合使用) 🔁 十、经典结构类题型(题型引导结构) 算法 🧮 一、基础算法(算法设计基础) 🧠 二、递归与分治 🔢 三、动态规划(Dynamic Programming) 1. 一维 DP(背包/线性状态) 2. 区间 DP / 记忆化 🔁 四、贪心算法(Greedy) 🧭 五、图论算法 1. 图遍历 2. 图最短路径 3. 最小生成树 MST 🎯 六、搜索类算法 1. 回溯(Backtracking) 2. 剪枝优化 🧩 七、位运算技巧 🧮 八、数学算法 💡 九、字符串算法 🧬 十、高级与综合算法 📌 十一、模拟类算法 ✅ 十二、算法范式对照表
数据结构
以下是对 LeetCode(力扣)题库中涉及的数据结构的系统性总结,覆盖从基础到高级,按类别细分,力求全面,便于查漏补缺或作为复习清单:
📦 一、线性数据结构
1. 数组与字符串
- 静态数组(int[], vector<int> 等)
- 动态数组(如 ArrayList, std::vector)
- 字符串(string, char[])
- 字符数组和字符串之间的转换
- 前缀和数组(Prefix Sum)
- 差分数组(Difference Array)
- 滑动窗口(双指针)
2. 链表(Linked List)
- 单链表(Singly Linked List)
- 双向链表(Doubly Linked List)
- 循环链表(Circular Linked List)
- 带随机指针的链表(Random Pointer List)
- 虚拟头节点技巧(Dummy Head)
3. 栈(Stack)
- 顺序栈(数组实现)
- 链式栈(链表实现)
- 单调栈(Monotonic Stack)
- 最小栈(Min Stack)
- 括号匹配类问题
4. 队列(Queue)
- 普通队列(FIFO)
- 循环队列
- 双端队列(Deque, 如 std::deque)
- 单调队列(Monotonic Queue)
- 队列模拟栈、栈模拟队列
🌲 二、树形结构
1. 二叉树(Binary Tree)
- 普通二叉树
- 完全二叉树(Complete Binary Tree)
- 满二叉树(Full Binary Tree)
- 平衡二叉树(Balanced Binary Tree)
- 二叉搜索树(BST)
- 线索二叉树(Threaded Binary Tree)
2. 特殊二叉树
- AVL树
- 红黑树(部分高级题)
- Segment Tree(线段树)
- Fenwick Tree / Binary Indexed Tree(树状数组)
- Trie(字典树/前缀树)
- Huffman Tree(赫夫曼编码)
3. N 叉树、K 叉树
- N-ary Tree
- Ternary Tree(例如三分搜索)
🔗 三、图结构(Graph)
- 邻接表(Adjacency List)
- 邻接矩阵(Adjacency Matrix)
- 有向图 / 无向图
- 加权图(Weighted Graph)
- 拓扑排序结构
- 并查集(Disjoint Set Union, Union-Find)
- 图遍历辅助结构:
- 访问标记数组
- 路径记录栈
- 深度优先遍历(DFS 栈)
- 广度优先遍历(BFS 队列)
📊 四、堆与优先队列
- 最小堆 / 最大堆(Min Heap / Max Heap)
- K路归并堆(如合并多个有序链表)
- 双堆(Two Heaps,常用于中位数问题)
- 自定义比较器的优先队列
🔎 五、查找结构
- 哈希表(Hash Table / Map)
- 哈希集合(Hash Set)
- 有序映射(如 TreeMap, std::map)
- LRU 缓存(基于哈希表 + 双向链表)
- LFU 缓存(基于多种数据结构组合)
📐 六、区间与线性结构扩展
- 区间树(Interval Tree)
- 动态开点线段树(稀疏 Segment Tree)
- 线段树合并、树上差分
- 稀疏表(Sparse Table)
- 树链剖分(Heavy-Light Decomposition)
- 树状图的 Euler 序列 & RMQ 转换
- 倍增(Binary Lifting)
📈 七、特殊结构/技巧
- 并查集(Union-Find)
- 字符统计表(计数数组)
- 多维数组(Matrix)
- 扫描线算法结构(含事件排序结构)
- 哈希双指针(Two HashSets)
- 动态规划表(DP 数组/矩阵)
- 状态压缩(位运算 + DP)
- 位图(Bitset)
🧠 八、用于建模或模拟的辅助结构
- 模拟类题目的手动栈/队列/指针结构
- 自定义对象 + 重载运算符(如堆的排序)
- 多路指针(多个数组/链表同步遍历)
- BFS 状态编码结构(例如编码二维状态为整数)
🧩 九、组合结构(组合使用)
- 栈 + 哈希表(如 LRU)
- 堆 + 哈希表(如 LFU)
- Trie + DFS(如词典搜索)
- 线段树 + 哈希(如区间频率查询)
- 并查集 + 路径压缩 + 按秩合并
- Hash + Bitset(判重、去重)
🔁 十、经典结构类题型(题型引导结构)
| 题型 | 常用数据结构 |
| 滑动窗口 | 双端队列、哈希表 |
| 区间合并 | 排序 + 栈或数组 |
| 括号匹配 | 栈 |
| 中位数 | 双堆(最小堆 + 最大堆) |
| 最近公共祖先 | 二叉树 + 路径记录 / 倍增 |
| Kth 问题 | 堆、快速选择、划分树 |
| 最短路径 | 图 + 堆(Dijkstra) |
| 连通性判定 | 并查集 |
| 子串/子序列匹配 | 滑动窗口 / DP / KMP |
| 缓存系统模拟 | 哈希 + 双向链表 |
算法
🧮 一、基础算法(算法设计基础)
| 类别 | 具体算法/技巧 | 应用示例 |
| 排序算法 | 冒泡排序、选择排序、插入排序 | 学术理解为主 |
| 高级排序 | 快速排序、归并排序、堆排序 | TopK 问题 |
| 计数排序 | 基数排序、桶排序、计数排序 | 非比较型排序 |
| 二分查找 | 标准二分查找、变形二分、搜索边界 | 有序数组查找类题目 |
| 双指针/滑动窗口 | 快慢指针、对撞指针、窗口移动 | 子串、最长子序列 |
🧠 二、递归与分治
| 技术分类 | 说明与典型题型 |
| 递归 | 树遍历、分解问题、回溯前驱 |
| 分治 | 归并排序、快速排序、矩阵乘法 |
| 模板题 | LeetCode 53(最大子数组)、169(多数元素) |
🔢 三、动态规划(Dynamic Programming)
1. 一维 DP(背包/线性状态)
| 题型 | 描述 | 例题 |
| 0-1 背包 | 状态转移 dp[i][j] | 416 |
| 完全背包 | 每个物品无限个 | 518 |
| 子序列 | LIS, LCS, 最长回文子串 | 300, 1143, 5 |
| 线性状态转移 | 打家劫舍、买卖股票 | 198, 121 |
2. 区间 DP / 记忆化
| 类型 | 描述 | 示例题目 |
| 区间 DP | 回文切割、戳气球 | 132, 312 |
| 记忆化搜索 | DFS + 缓存 | 91, 70 |
🔁 四、贪心算法(Greedy)
| 应用场景 | 示例题 |
| 区间调度问题 | 435(无重叠区间) |
| 最小跳数问题 | 45(Jump Game II) |
| 字符串字典序处理 | 402(移除 K 位数字) |
| 加油、覆盖、区间选择 | 134, 452, 763 |
🧭 五、图论算法
1. 图遍历
| 类型 | 技术 | 示例 |
| DFS | 递归/栈遍历 | 130, 695 |
| BFS | 队列,层次遍历 | 200, 752 |
| 拓扑排序 | 有向无环图 DAG 处理 | 207, 210 |
| 连通分量 | 并查集 + 图遍历 | 684, 547 |
2. 图最短路径
| 算法 | 描述 | 示例题 |
| Dijkstra | 正权图单源最短路径 | 743 |
| Bellman-Ford | 负边图处理 | 787 |
| Floyd-Warshall | 多源最短路径 | 1334 |
3. 最小生成树 MST
| 算法 | 描述 | 示例 |
| Prim | 邻接矩阵更适用 | 1584 |
| Kruskal | 边排序 + 并查集 | 1135 |
🎯 六、搜索类算法
1. 回溯(Backtracking)
| 技术点 | 应用题目 |
| 子集/组合/排列 | 78, 90, 46, 47 |
| N 皇后 | 51 |
| 数独 | 37 |
| 括号生成 | 22 |
2. 剪枝优化
| 类型 | 示例 |
| 排序 + 剪枝 | 40(组合总和 II) |
| 状态记录 | 用 HashSet 记录中间状态 |
🧩 七、位运算技巧
| 应用领域 | 示例题 |
| 子集枚举 | 78 |
| 位图/压缩状态 | 401, 89 |
| 异或操作 | 136, 137, 260 |
| 位掩码动态规划 | TSP(旅行商问题)相关题目 |
🧮 八、数学算法
| 类别 | 描述 | 例题 |
| 质数筛选 | 埃拉托色筛法 | 204 |
| 数论 | 最大公约数、欧几里得算法 | 1071 |
| 快速幂 | 二分指数法 | 50 |
| 进制转换 | 二进制、十六进制处理 | 67, 405 |
| 模拟数学 | 罗马数字、分数化简等 | 12, 166 |
💡 九、字符串算法
| 技术/类别 | 应用或说明 | 示例 |
| 字符串哈希 | Rabin-Karp、滚动哈希 | 28 |
| KMP算法 | 前缀函数匹配 | 28 |
| 字典树(Trie) | 多字符串匹配、前缀搜索 | 208 |
| 后缀数组(SA) | 高级字符串算法 | 高频但偏门题目 |
🧬 十、高级与综合算法
| 算法类型 | 描述与场景 | 示例 |
| 状态压缩 DP | 用整数 bit 表示状态 | 847 |
| 记忆化搜索 + 状态压缩 | 旅行商、安排、分组 | 691 |
| 差分约束系统 | 区间限制类问题 | 543, 1101 |
| 分块、莫队算法 | 离线查询优化 | 1036(稀有) |
| 并查集 + 权重 | 变量关系、比值换算问题 | 399 |
| 二分答案 | 答案是单调性的数值问题 | 875, 1011 |
📌 十一、模拟类算法
| 场景 | 示例 |
| 数据结构模拟 | LRU(146),LFU(460) |
| 数字游戏 | 电梯/加油站类模拟 |
| 时钟/轮转类 | 轮转数组、滑动时间窗口等 |
✅ 十二、算法范式对照表
| 范式 | 代表题目 |
| 分治 | 53(最大子数组) |
| 贪心 | 55(跳跃游戏) |
| 动态规划 | 198(打家劫舍) |
| 回溯/搜索 | 46(全排列) |
| 图论 | 200(岛屿数量) |
| 数学与数论 | 204(计数质数) |
| 模拟 | 146(LRU 缓存) |