在这里训练 模式 。
练习 在 LeetCode。
我们不是另一个题库。我们要把从 读题 到 看出门道 的距离从几小时压缩到几分钟 —— 用交互式动画讲清楚 思维模型,而不是语法。
族 · 3 个子模式
双 指针
两个下标在同一序列上移动以维持不变式 — 包含对向、快慢、滑动窗口三种子模式。
对向 · 快慢 · 滑动
单模式
二分查找 变体
边界条件是这一领域最大的、尚未被讲透的教学难点。
3 种变体 · O(log n)
单模式
回溯
决策树式展开 — 这种结构天然适合用动画来理解。
分支状态机
单模式
单调 栈
栈状态的迁移在代码里看不出来,在动画里却充满戏剧性 —— 栈本身就是主角。
下一个更大元素 · 直方图
第二阶段
网格上的 BFS / DFS
队列给出广度,栈给出深度 —— 同一种算法,两种遍历顺序。
队列 · 栈 · 洪水填充
族 · 3 个子模式
堆与 优先队列
廉价拿到极值 —— 最小或最大 —— 其余元素保持松散有序。共 3 个子模式:Top-K、双堆、合并 K 路。
Top-K · 双堆 · 合并 K 路
第二阶段
树的 遍历
每种遍历都会访问每个节点一次 —— 差别只在于相对子节点递归的时机不同。
前序 · 中序 · 后序 · 层序
第二阶段
链表的 就地操作
三个指针 —— prev、curr、next —— 让你在不丢失尾部的前提下原地重写一条链表。
翻转 · 合并 · 重排
族 · 5 个子模式
动态 规划
一张表格逐格填充,每一格由常数个先前的格子组合而来。共 5 个子模式。
一维 · 二维 · 背包 · 区间 · 状态机
单模式 · 第三阶段
并 查集
维护 N 个元素的不相交划分 —— 在近常数时间内合并两个分量,森林会在每次查询时自我扁平化。
连通分量 · O(α(N))
单模式 · 第三阶段
字典树
把一组字符串存储在字符构成的树上 —— 共前缀的单词共享路径,一个 “end-of-word” 标志把已存单词和中途的前缀区分开。
前缀查询 · 自动补全 · 单词搜索
单模式 · 第三阶段
拓扑 排序
把有向无环图线性化,使每条边都从左指向右 —— 每个节点只在所有前置都已离开后才进入序列。
Kahn 算法 · O(V + E) · 环检测
族 · 4 个子模式
前缀 和
前置花一次 O(N),让每次区间查询摊销到 O(1) —— 反过来用,又能实现廉价的区间更新。共 4 个子模式。
一维 · 二维 · 差分 · 哈希
族 · 4 个子模式
最短 路径
从源点出发到所有节点的最短距离 —— 机制按「边能携带什么」分叉。等权用 BFS,非负权用 Dijkstra,允许负权用 Bellman-Ford,全源用 Floyd-Warshall。
BFS · Dijkstra · Bellman-Ford · Floyd-Warshall
单模式
区间 合并
先按起点排序,然后线性扫一遍 —— 每个区间要么把当前合并区间向右扩,要么把它提交后另起一段。整个模式就是这一次比较。
排序 + 线性扫描 · O(N log N)
单模式
位 运算
把整数当作它的二进制位看,而不是它的数值 —— 一个数对自己异或得 0,对 0 异或保持不变。难点在于看出问题里隐藏的位级结构。
XOR · 位掩码 · O(N)
族 · 2 个子模式
循环 排序
当取值落在 [0, N] 或 [1, N] 时,下标本身就是指针 —— 每个元素都知道自己的家。把它换回家,或翻转符号标记已见,就能在 O(N) 时间、O(1) 空间里解决一整族「缺失 / 重复」问题。
下标即指针 · O(N)
单模式
扫描 线
把每个区间拆成起点 +1、终点 −1 两个事件,按位置排序后扫一遍。运行的活跃数随事件升降 —— 它的峰值就是「同时最多」类问题的答案。
端点事件 · 运行峰值 · O(N log N)