-
https://leetcode.cn/problems/kth-largest-element-in-a-stream/?
-
设计一个找到数据流中第 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 <= 104
0 <= nums.length <= 104
-104 <= nums[i] <= 104
-104 <= val <= 104
最多调用 add 方法 104 次
题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素
class KthLargest {
public:
KthLargest(int k, vector<int>& nums) {
}
int add(int val) {
}
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest* obj = new KthLargest(k, nums);
* int param_1 = obj->add(val);
*/
CODE
优先队列
-
priority_queue
https://en.cppreference.com/w/cpp/container/priority_queue -
C++中的优先队列是一种基于堆的数据结构,它可以帮助我们以
优先级
的方式组织元素。在优先队列中,元素按照一定的优先级顺序排列,每次访问时都会访问优先级最高的元素。以下是一些常见的操作:
C++中的优先队列是一个模板类,定义如下:
template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type>> class priority_queue;
其中,T表示元素的类型,Container表示容器类型,Compare表示元素比较函数类型,默认情况下,使用std::less比较函数,即元素类型T必须支持小于运算符(operator<)。
优先队列的常用操作有:
-
push(x):将元素x插入队列中
-
pop():删除队列中的最高优先级元素
-
top():返回队列中的最高优先级元素
-
empty():判断队列是否为空
-
size():返回队列中元素的个数
-
C++ 的 std::priority_queue 默认使用最大堆(max heap)实现。这意味着具有较高优先级的元素会被放置在队列的前面。
-
如果你想要使用最小堆(min heap),可以通过提供自定义的比较函数来实现。比较函数应该返回 true 如果第一个参数应该排在第二个参数之前。以下是一个使用最小堆的示例:
// 输出为: 1 1 3 4
#include <iostream>
#include <queue>
struct Compare {
bool operator()(int a, int b) {
return a > b; // 返回 true 表示 a 应该排在 b 之前
}
};
int main() {
std::priority_queue<int, std::vector<int>, Compare> pq;
pq.push(3);
pq.push(1);
pq.push(4);
pq.push(1);
while (!pq.empty()) {
std::cout << pq.top() << " ";
pq.pop();
}
return 0;
}
题解
class KthLargest {
public:
priority_queue<int, vector<int>, greater<int>> q;
int k;
KthLargest(int k, vector<int>& nums) {
this->k = k;
for (auto& x: nums) {
add(x);
}
}
int add(int val) {
q.push(val);
if (q.size() > k) {
q.pop();
}
return q.top();
}
};