题目
思路
本题需要用到小根堆,堆中保存前k大的数,堆顶元素就是第k大的数
- 当堆中元素个数不足
k
时,直接将元素入堆
- 当新加元素
val
小于等于堆顶元素时,说明val
一定不可能成为前k大的数,因为已经有k
个比val
大的数在堆中了,因此抛弃val
- 当新加元素
val
大于堆顶元素时,说明堆顶元素一定不可能成为前k
大的数,因为堆中有k-1
个元素比堆顶大,加上新来的val
,一共k
个数比堆顶元素大,因此弹出堆顶,将val
入堆
代码
class KthLargest {
private PriorityQueue<Integer> pq = new PriorityQueue<>();
private int size;
public KthLargest(int k, int[] nums) {
this.size = k;
for (int num : nums) {
add(num);
}
}
public int add(int val) {
if (pq.size() < this.size) {
pq.offer(val);
return pq.peek();
}
if (val <= pq.peek()) {
return pq.peek();
}
pq.poll();
pq.offer(val);
return pq.peek();
}
}