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(); } }