01双指针
适用信号
线性结构上要配对、去重、找距离,或链表上要「差几步 / 是否成环」。
骨架
- 对撞:有序顺序表两端向中间收。依赖随机下标 O(1)。
- 快慢:同向不同步长。环检测:同一起点按 next 推进;快慢在非空结点相遇 → 有环;快指针或其 next 到 null → 无环。未相遇的中间时刻不能判无环。
- 间距:倒数第 k:声明 1≤k≤n;快指针先走 k 步(不足则非法),再同步推进至快指针为 null,慢指针即倒数第 k 个。
变体
有序两数之和(对撞);链表中点(快 2 慢 1);删除倒数结点(间距 + 前驱)。
易错:链表没有随机 O(1),对撞不能直接搬到单链表。改链仍要前驱。
02滑动窗口
区间右端扩张、左端收缩,维护窗口内的计数或最值。要维护最值且单调时用单调队列:入队从队尾删劣值;下标过期从队首弹出(队列存下标)。缺这两条算法不成立。
变体
定长窗口统计;不定长「至少 / 至多」约束;窗口最值。
易错:课内循环队列满空(front==rear 空,(rear+1)%M==front 满)不因单调队列而改写。
04贪心
每步取局部看起来最好的,指望全局也最好。课内留下的是具体算法:哈夫曼、Dijkstra(非负)、Kruskal / Prim(无向可负)。不要写「贪心都是 O(n log n)」。
可证性一般贪心的交换论证、活动选择等,不是 408 必答。用各算法自己的前提,不要用「贪心模式」覆盖 Dijkstra 非负。
变体
选边造树(MST);非负最短路;前缀码(哈夫曼)。