ps:刷题笔记
我的思路: 将所有数据逐个加入到优先级队列中,每次取第K个值时,不断从大根堆中取出k个元素,然后再将前k-1个元素放回队列,但数据量巨大时,此方法时空复杂度都很高。每次添加数据后,都需要遍历所有数据中的前k个数据。
看答案后发现,题目中只要求第K大元素,所以在存储数据时,可以只保存前K大元素在优先级队列。此时队列使用一个小根堆,堆顶元素是这K各元素中最小的一个。
每次加入新元素value时,如果value<top(),则说明此值不在前k个元素中。否则,将value加入到小根堆后,堆自动调整堆顶元素,然后将堆顶第K+1大的元素弹出即可。
class KthLargest {
int kth;
priority_queue<int,vector<int>,std::greater<int>> queue;
public:
KthLargest(int k, vector<int>& nums) {
kth = k;
for(auto n:nums){
add(n);
}
}
int add(int val) {
queue.push(val);
if(queue.size()>kth){queue.pop();}
return queue.top();
}
};