设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-a-stream
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————
Python代码:
class KthLargest:
def __init__(self, k: int, nums: List[int]):
self.k = k
self.li = nums
self.li = sorted(self.li)[-k:]
heapq.heapify(self.li)
def add(self, val: int) -> int:
if len(self.li) < self.k:
heapq.heappush(self.li, val)
return self.li[0]
if val < self.li[0]:
return self.li[0]
heapq.heappushpop(self.li, val) # 先push后pop
return self.li[0]
C++代码:
class KthLargest {
private:
priority_queue<int, vector<int>, greater<int>> pq; //小顶堆,堆头元素最小
int K;
public:
KthLargest(int k, vector<int>& nums) {
for (auto num : nums) {
pq.push(num);
if (pq.size() > k)
pq.pop();
}
K = k;
}
int add(int val) {
pq.push(val);
if (pq.size() > K) pq.pop();
return pq.top();
}
};