难度简单
设计一个找到数据流中第 k
大元素的类(class)。注意是排序后的第 k
大元素,不是第 k
个不同的元素。
请实现 KthLargest
类:
KthLargest(int k, int[] nums)
使用整数k
和整数流nums
初始化对象。int add(int val)
将val
插入数据流nums
后,返回当前数据流中第k
大的元素。
思路:
采用最小堆方式实现,每次抛出的数据为当前最小数据;
保留K个数据大小的堆,可以满足上述需求。
class KthLargest {
public:
priority_queue<int, vector<int>, greater<int>> data; // 最小堆
int k;
// // 使用 while 判断, 减少了初始化的时间损耗
KthLargest(int k, vector<int>& nums) {
this->k = k;
for(auto& index:nums)
data.push(index);
while(data.size() > k) {
data.pop();
}
}
int add(int val) {
data.push(val);
if(data.size() > k) {
data.pop();
}
return data.top();
}
};
上述方法缺点:存在重复的代码段
if(data.size() > k) {
data.pop();
}
可以将其简化为类中的一个成员函数,然后调用该成员函数,如下:
class KthLargest {
public:
priority_queue<int, vector<int>, greater<int>> data; // 最小堆
int k;
KthLargest(int k, vector<int>& nums) {
this->k = k;
for(auto& index:nums)
add(index); // 使用该语句,减少了代码量, 但是响应的提升了代码初始化的速度
}
int add(int val) {
data.push(val);
if(data.size() > k) {
data.pop();
}
return data.top();
}
};