数据结构

Topic · Problem Patterns

经典题型
模式

面试与竞赛常用走法,不是 408 另一套大纲。口径与 Offer 题型页、进阶指南 已钉的边界一致。模式名可以少讲,不能讲错。

01双指针

适用信号

线性结构上要配对、去重、找距离,或链表上要「差几步 / 是否成环」。

骨架

  • 对撞:有序顺序表两端向中间收。依赖随机下标 O(1)。
  • 快慢:同向不同步长。环检测:同一起点按 next 推进;快慢在非空结点相遇 → 有环;快指针或其 next 到 null → 无环。未相遇的中间时刻不能判无环。
  • 间距:倒数第 k:声明 1≤k≤n;快指针先走 k 步(不足则非法),再同步推进至快指针为 null,慢指针即倒数第 k 个。

变体

有序两数之和(对撞);链表中点(快 2 慢 1);删除倒数结点(间距 + 前驱)。

易错:链表没有随机 O(1),对撞不能直接搬到单链表。改链仍要前驱。

02滑动窗口

区间右端扩张、左端收缩,维护窗口内的计数或最值。要维护最值且单调时用单调队列:入队从队尾删劣值;下标过期从队首弹出(队列存下标)。缺这两条算法不成立。

变体

定长窗口统计;不定长「至少 / 至多」约束;窗口最值。

易错:课内循环队列满空(front==rear 空,(rear+1)%M==front 满)不因单调队列而改写。

03分治

划成规模更小的同类子问题,合并答案。课内实例:归并、快排、折半。折半前提仍是有序顺序表。

进阶 / 超出 408主定理三种情况的套用与证明过程,统考不要求展开。点到「递推式怎么读」即可。

变体

归并合并两有序段;快排划分(平均须随机输入或随机枢轴,最坏 Θ(n²));序列最大子段(课内不一定单列)。

04贪心

每步取局部看起来最好的,指望全局也最好。课内留下的是具体算法:哈夫曼、Dijkstra(非负)、Kruskal / Prim(无向可负)。不要写「贪心都是 O(n log n)」。

可证性一般贪心的交换论证、活动选择等,不是 408 必答。用各算法自己的前提,不要用「贪心模式」覆盖 Dijkstra 非负。

变体

选边造树(MST);非负最短路;前缀码(哈夫曼)。

05接到动态规划

子问题有重叠、最优结构可复用时,才从分治改记表。DP 在 408 数据结构不单列。四要素与 LCS / 背包见 动态规划专题,填表见 LCS 演示。