面试数据结构:堆与优先队列

堆是一种支持快速取最值的数据结构。

priority_queue

std::priority_queue<int> pq;

默认是大根堆。

小根堆可以这样写:

std::priority_queue<int, std::vector<int>, std::greater<int>> pq;

常见题型

堆操作复杂度通常是 O(log n)

top K 的两种做法

如果要找最大的 K 个数,可以用小根堆维护当前前 K 大:

std::priority_queue<int, std::vector<int>, std::greater<int>> heap;
for (int x : nums) {
    heap.push(x);
    if (heap.size() > k) heap.pop();
}

堆顶是当前 K 个数里最小的那个。遍历结束后,堆里就是答案集合。

堆不是排序的替代品

如果你需要完整有序结果,排序通常更简单。如果你只需要动态维护最值或前 K 个元素,堆更合适。

面试判断

看到“第 K 大”“数据流”“实时最值”“合并多个有序序列”,应该立刻想到堆。但也要估算复杂度:堆适合 K 远小于 N 的场景。

评论

...

正在读取评论。