703. Kth Largest Element in a Stream - Easy
Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth distinct element.
Your KthLargest
class will have a constructor which accepts an integer k
and an integer array nums
, which contains initial elements from the stream. For each call to the method KthLargest.add
, return the element representing the kth largest element in the stream.
Example:
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
Note:
You may assume that nums
' length ≥ k-1
and k
≥ 1.
建立一个min heap,只包含k个最大的元素。
constructor把nums各项放入min heap,只保留k个最大数。add函数先把当前val放入min heap,如果heap的size > k就移出堆顶最小元素。最后返回min heap的堆顶元素
*注意记得k的处理
时间O(NlogK),空间O(K)
class KthLargest { PriorityQueue<Integer> minHeap; int k; public KthLargest(int k, int[] nums) { this.k = k; minHeap = new PriorityQueue<>(); for(int n : nums) { minHeap.offer(n); if(minHeap.size() > k) minHeap.poll(); } } public int add(int val) { minHeap.offer(val); if(minHeap.size() > k) minHeap.poll(); return minHeap.peek(); } }