[编程题] lc:703. 数据流中的第K大元素
题目描述
输入输出
思路
使用一个小顶堆,我们始终让小顶堆自平衡的调整保存需要的前k大小的元素,(堆顶元素最小,也就是这组数组的第k)。在我们添加一个元素进来的时候,只需要和堆顶元素比较,如果要添加的val比堆顶元素都小的话,就丢弃,如果比堆顶元素大的话,就去掉堆顶元素,添加该元素到堆中自平衡后返回堆顶就是我们要的第K大的数。
Java代码
class KthLargest {
//小顶堆实现
PriorityQueue<Integer> priorityQueue;
int k;
public KthLargest(int k, int[] nums) {
this.k = k;
priorityQueue = new PriorityQueue<>(k);
//把数组中的元素存入堆中
for(int num:nums){
this.add(num); //这里调用加入小顶堆的方法选出前3的元素在堆中
}
}
public int add(int val) {
if(priorityQueue.size()<k){
priorityQueue.offer(val);
}else if(priorityQueue.peek()<val){ //队满的情况下就看小顶堆的堆顶元素是是否需要移除
priorityQueue.poll();
priorityQueue.offer(val);
}
//返回小顶堆的堆顶级第三大的元素
return priorityQueue.peek();
}
}
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/
输出
时间复杂度
O(N*logn)