优先队列核心原理与经典算法题实战
优先队列(堆)在处理动态最值问题时效率极高。相比普通数组排序,它能将操作复杂度从 O(N log N) 降低到 O(log N)。下面通过四道经典题目,梳理不同场景下的堆用法。
1. 最后一块石头的重量
参考题目: 1046.最后一块石头的重量

思路分析: 题意是不断取出当前最大的两个石头进行碰撞,差值再放回。如果每次都对数组排序,开销太大。利用大根堆(Max Heap),我们可以直接获取堆顶最大值,弹出后再取次大值,差值重新入堆即可。
参考实现:
import java.util.PriorityQueue;
class Solution {
public int lastStoneWeight(int[] stones) {
// 创建大根堆,比较器反转默认顺序
PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> b - a);
// 所有石头入堆
for (int stone : stones) {
queue.offer(stone);
}
// 模拟碰撞过程
while (queue.size() > 1) {
int y = queue.poll(); // 最大
int x = queue.poll(); // 次大
if (y - x > 0) {
queue.offer(y - x);
}
}
return queue.isEmpty() ? 0 : queue.poll();
}
}
时间复杂度:O(n log n),空间复杂度:O(n)




