题目描述:
设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。
思路:
维护一个大小为K的小顶堆,当堆不满时,直接将元素添加进来。当堆满时,比较新来的元素和最小堆堆顶的大小,如果小于,则直接丢弃,如果大于则将最小堆堆顶丢弃,新元素入堆,重新调整堆即可。
class KthLargest {
PriorityQueue<Integer> queue ;
int k;
public KthLargest(int k, int[] nums) {
this.k = k;
queue = new PriorityQueue<>(k);
for(int n: nums)
add(n);
}
public int add(int val) {
if(queue.size()<k)
queue.offer(val);
else if(queue.peek()<val){
queue.poll();
queue.offer(val);
}
return queue.peek();
}
}
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/
网友评论