设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。
class KthLargest {
//小顶堆
private PriorityQueue<Integer> heap = null;
private int k = 0;
public KthLargest(int k, int[] nums) {
this.heap = new PriorityQueue<>();
this.k = k;
//遍历数组
for (int i = 0; i < nums.length; i++) {
//先把堆填满(大小为k)
if (heap.size() < k) {
heap.offer(nums[i]);
}
//填满后,如果数组的值比堆顶大,去掉堆顶,然后把数组的值放到堆中(堆顶为最小值,也是第k大元素)
else if (nums[i] > heap.peek()) {
heap.poll();
heap.offer(nums[i]);
}
}
}
public int add(int val) {
//如果堆没满,直接放入
if (heap.size() < k) {
heap.offer(val);
}
//如果堆满了,比较添加的值和堆顶的大小
else if (val > heap.peek()) {
heap.poll();
heap.offer(val);
}
return heap.peek();
}
}
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/
把小顶堆的大小规定为k,如果比堆顶大,就放入,一直保持堆的大小为k,那么每次堆顶就为第k大元素。