题目地址:
https://leetcode.com/problems/kth-largest-element-in-a-stream/
要求设计一个数据结构,可以在线计算数据流里第 k k k大的数(这里第 k k k大的意思是从大到小排好序后位于第 k k k位的数,从 1 1 1开始数)。
思路是用最小堆,先将堆里放满 k k k个数,这样堆顶即为第 k k k大的数。再来新数时,只有比堆顶大,才让其替换堆顶从而进堆;否则略过。这样堆顶就维持住一直等于 k k k大的数了。代码如下:
class KthLargest {
public:
priority_queue<int, vector<int>, greater<>> heap;
int k;
KthLargest(int k, vector<int>& a) {
this->k = k;
for (int x : a) {
heap.push(x);
if (heap.size() > k) heap.pop();
}
}
int add(int val) {
heap.push(val);
if (heap.size() > k) heap.pop();
return heap.top();
}
};
初始化时间复杂度 O ( n log k ) O(n\log k) O(nlogk),add时间复杂度 O ( log k ) O(\log k) O(logk)。空间 O ( k ) O(k) O(k)。