703 非常经典的一个题,假设有一个不断增加的序列,要求输出第K 大的数

int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3);   // returns 4
kthLargest.add(5);   // returns 5
kthLargest.add(10);  // returns 5
kthLargest.add(9);   // returns 8
kthLargest.add(4);   // returns 8


举例: 假设有10000000个元素,假设求第5大的元素, 就是构建一个 size =5 的 “最小堆”,然后每次add 时都只add 比当前 堆里peek 大的值, 这样当PQ 填满时的peek 就是第5大的。
class KthLargest {
    
    Queue<Integer> pq ;
    int max_size;

    public KthLargest(int k, int[] nums) {
        
        pq = new PriorityQueue<>(k);
        max_size = k;
        for(int num: nums){
            this.add(num);  //调用成员函数的add 
        }
    }
    
    public int add(int val) {
        if(pq.size() <max_size) pq.offer(val);
        
        else if(val >pq.peek()) {
           pq.offer(val);
           pq.poll(); 
        }
        
        return pq.peek();
    }
}

215 太简单了,就不说了。

class Solution {
    public int findKthLargest(int[] nums, int k) {
        
        Queue<Integer> max_heap = new PriorityQueue<>((o1,o2)->o2-o1);
        
        for(int num: nums){
            max_heap.add(num);
        }
        
        for(int i=1; i<k; i++){
            max_heap.poll();
        }
        return max_heap.peek();
        
    }
}

 

posted on 2019-01-15 04:32  KeepAC  阅读(83)  评论(0编辑  收藏  举报