核心概念

这里并不讨论堆的实现和基本的原理, 只是讨论这个数据结构的使用场景, 解决的问题

使用堆我们能获得O(logn)的时间复杂度的插入和删除元素, O(1)的时间复杂度的获取某个集合的最大(小)值

如果一个场景需要持续获取某个变化集合的最大(小)值, 我们就能考虑使用堆, 并且一定会有出堆操作!!! 不然我们简单维护一个min或max变量就行了

一般解法

1
2
3
4
// 创建小堆
Queue<Integer> minHeap = new PriorityQueue<>();
// 创建大堆
Queue<Integer> maxHeap = new PriorityQueue<>((a,b) -> b-a);

典型例题

295. 数据流的中位数

347. 前 K 个高频元素

215. 数组中的第K个最大元素