题目描述:

设计一个找到数据流中第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);
 */