[编程题] lc 703. 数据流中的第K大元素

[编程题] lc:703. 数据流中的第K大元素

题目描述

image-20200724161252056

输入输出

image-20200724161305523

思路

使用一个小顶堆,我们始终让小顶堆自平衡的调整保存需要的前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);
 */

输出

image-20200724161603908

时间复杂度

O(N*logn)

posted @ 2020-07-24 16:18  北鼻coder  阅读(200)  评论(0编辑  收藏  举报