BLOG

Record, summarize, and improve.

leetcode

数据结构

以下是对 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 缓存)