图解算法通识讲义树与图
堆与优先队列 Top-K 动态流维护
核心心智模型:局部堆顶,动态过滤;求前 K 个最大用小顶堆,对流式数据维持 O(log K) 的极值筛选。
核心交互式算法图解演练沙盒
堆与优先队列模型
小顶堆动态维护 Top-K 极值演练
步骤 1 / 4
当前扫描元素:3堆未满,直接入堆
堆操作单步耗时: O(log K)固定大小为 2 的小顶堆结构 (Min-Heap)
3堆顶 (门槛)
Top-2 大元素求解(维护大小为 2 的小顶堆):元素 3 进入堆,成为当前堆顶。
关键操作与时空复杂度速查对照表
| 操作 / 算法阶段 | 平均时间 | 最坏时间 | 空间复杂度 | 核心底层机制 |
|---|---|---|---|---|
| 查看堆顶极值 | O(1) | O(1) | O(1) | 直接读取堆顶数组下标 0 即可。 |
| 插入 / 弹出极值 | O(log K) | O(log K) | O(1) | 在高度为 log K 的完全二叉树上上浮或下沉调整。 |
template.java
PriorityQueue<Integer> minHeap = new PriorityQueue<>(k);
for (int num : nums) {
minHeap.offer(num);
if (minHeap.size() > k) {
minHeap.poll();
}
}
return minHeap.peek();解题核心心法提炼
- 找第 K 大元素用容量 K 的小顶堆;找第 K 小元素用大顶堆。
- 数据流中位数设计:对顶堆,大顶堆和小顶堆元素数量差维持不超过 1。
- 优先队列自定义比较器时,Java 默认是小顶堆,(a, b) -> b - a 可逆转为大顶堆。
常见踩坑警示与避坑指南
- Java 比较器中直接使用 a - b 进行比较可能导致整数下溢溢出,推荐使用 Integer.compare(a, b)。
- 误将全部 N 个元素推入大顶堆再弹 K 次,这退化为了 O(N log N),违背了 Top-K 的剪枝初衷。
对应 Hot 100 实战题目突围
原理已掌握!立即进入沉浸式工作台开始实战演练,强化代码肌肉记忆