动态数组
连续存储 + O(1) 下标访问——追加、插入、删除,以及搬移开销。
课程目录
排序、搜索、动态规划、图算法、经典算法题
动态数组
连续存储 + O(1) 下标访问——追加、插入、删除,以及搬移开销。
栈
后进先出(LIFO)— push、pop 操作
单调栈
保持栈内数值有序,弹出较小候选,找到每个元素右侧第一个更大的值。
队列
先进先出(FIFO)— enqueue、dequeue 操作
链表
单链表 — 节点、head、next 指针
双向链表
prev + next — O(1) 删除、双向遍历
循环链表
tail.next = head — 环形,无 null 末端
哈希表 — 分离链接
每个桶挂一条链表,冲突的键串成链
哈希表 — 线性探测
开放寻址:冲突时向后探测,删除留墓碑
树的基础
根、子节点、高度,以及三种遍历顺序——树的基本词汇。
二叉搜索树
有序二叉树 — 插入、查找、删除(含后继替换)
AVL 树
插入导致节点失衡时旋转、以保持高度平衡的 BST。
红黑树
靠重新染色与旋转维持平衡——多数标准库背后的那棵树。
堆
最小堆、最大堆、优先队列
字典树(Trie)
高效字符串前缀检索
并查集
不相交集合 + 路径压缩
图的表示
邻接表 vs 邻接矩阵、边与度——图如何变成数据。
线性查找
从头扫到尾,找到为止——最朴素的方法,也是最坏情况。
二分查找
有序数据对数级查找
双指针
两个下标在有序数组上对向移动——配对求和与收缩区间。
滑动窗口
在序列上伸缩一个窗口,以 O(n) 回答子数组问题。
前缀和
先算一次累计和,之后任意区间和只需一次减法。
深度优先搜索
使用栈的图遍历
广度优先搜索
使用队列的图遍历
树的遍历
前序、中序与后序——同一棵树,三种访问顺序。
连通分量
用 DFS/BFS 扫过未访问的节点,给图的每座孤岛贴上标签。
A* 寻路
启发式最短路径
两数之和 (LeetCode #1)
找出和为目标值的两个数的下标 — 一次遍历 + 哈希表
LRU 缓存 (LeetCode #146)
O(1) 读写 — 哈希表与双向链表协同工作
接雨水 (LeetCode #42)
先构建两侧边界数组,再压缩成两个运行最大值,每次确定一列积水
三数之和 (LeetCode #15)
排序后固定一个数,双指针向内收缩 — 跳过重复值