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 integerk
and an integer arraynums
, which contains initial elements from the stream. For each call to the methodKthLargest.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
【思路一】保存前K个最大的值,每次加入新数字后,如果比之前K个中的min还小,则不做任何操作;如果大于min,则把这些数重新排列,然后删除掉最小的值继续保留前k个最大值。时间复杂度为O(N*KlogK)。
【思路二】用优先队列,维护一个小顶堆(Min Heap),Size = K。复杂度为:O(N*logK)
class KthLargest {
public:
KthLargest(int k, vector<int> nums) {
size = k;
for(auto num:nums){
q.push(num);
if(q.size() > size)
q.pop();
}
}
int add(int val) {
q.push(val);
if(q.size() > size)
q.pop();
return q.top();
}
private:
priority_queue<int,vector<int>, greater<int> > q;
int size;
};