携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情
一、题目描述:
703. 数据流中的第 K 大元素 - 力扣(LeetCode) (leetcode-cn.com)
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
请实现 KthLargest 类:
- KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
- int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
示例:
输入:
["KthLargest", "add", "add", "add", "add", "add"]
[[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
输出:
[null, 4, 5, 5, 8, 8]
解释:
KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
kthLargest.add(3); // return 4
kthLargest.add(5); // return 5
kthLargest.add(10); // return 5
kthLargest.add(9); // return 8
kthLargest.add(4); // return 8
提示:
- 1 <= k <= 10^4
- 0 <= nums.length <= 10^4
- -10^4 <= nums[i] <= 10^4
- -10^4 <= val <= 10^4
- 最多调用 add 方法 10^4 次
- 题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素
二、思路分析:
- 大顶堆排序取前k大的元素
- 悉数入小顶堆
- add时的数比堆顶小,忽略
- add时的数比堆顶大,则重新建立堆
对于出错的示例
需要考虑,输入数据中:
- nums.size() == 0 的情况
- nums.size() < k的情况,导致add时数比小顶堆小也不能忽略
三、AC 代码:
#include <vector>
#include <algorithm>
//取最大的k个元素,得容量为k的小顶堆
//满足的元素即在堆顶部
//其余的忽略
//每次新增,若更大,则入堆,否则忽略
//nums 初始为空的情况
class KthLargest {
int kVal;
vector<int> myHeap ={};
public:
KthLargest(int k, vector<int>& nums) {
kVal = k;
if(0 == nums.size()){
return;
}
//大顶堆
make_heap(nums.begin(), nums.end(), less<int>());
//堆排序,取较大的K个/size个
k = (k < nums.size()) ? k : nums.size();
for(int i = 0; i < k; i++){
myHeap.push_back(*nums.begin());
pop_heap(nums.begin(), nums.end()-i, less<int>()); //pop_heap之后在容器的尾部
//nums.pop_back();
}
//小顶堆
make_heap(myHeap.begin(), myHeap.end(), greater<int>());
}
int add(int val) {
if(0 == myHeap.size()){
myHeap.push_back(val);
//小顶堆
make_heap(myHeap.begin(), myHeap.end(), greater<int>());
if(1 == kVal){
return *myHeap.begin();
}
}
if( myHeap.size() < kVal){
myHeap.push_back(val);
push_heap(myHeap.begin(), myHeap.end(), greater<int>());
}
else if(val < *myHeap.begin() ){
1;
//return *myHeap.begin();
}
else{
pop_heap(myHeap.begin(), myHeap.end(), greater<int>());
myHeap.pop_back();
myHeap.push_back(val);
push_heap(myHeap.begin(), myHeap.end(), greater<int>());
}
return *myHeap.begin();
}
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest* obj = new KthLargest(k, nums);
* int param_1 = obj->add(val);
*/