设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest
类需要一个同时接收整数 k
和整数数组nums
的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add
,返回当前数据流中第K大的元素。
示例:
int k = 3; int[] arr = [4,5,8,2]; KthLargest kthLargest = new KthLargest(3, arr); kthLargest.add(3); // returns 4 kthLargest.add(5); // returns 5 kthLargest.add(10); // returns 5 kthLargest.add(9); // returns 8 kthLargest.add(4); // returns 8
说明:
你可以假设 nums
的长度≥ k-1
且k
≥ 1。
这道题使用的是优先队列的思想,将某中特征的数优先放进队列,而STL中正有这样的算法,这道题用小根堆解决
Min-heap: 父节点的值小于于或等于子节点的值
stl的算法为priority_queue<Type, Container, Functional>
其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,
优先队列就是大顶堆,队头元素最大。
这道题用到的:如果重载operator > 可直接使用priority_queue<Node,vector<Node>,greater<Node>>
常用的操作如下:
empty() 如果优先队列为空,则返回真
pop() 删除第一个元素
push() 加入一个元素
size() 返回优先队列中拥有的元素的个数
top() 返回优先队列中有最高优先级的元素
这道题的核心思想为 将k的值和堆内元素的个数相同,这个就保证堆内的数据是数组内前k个最大的
class KthLargest {
public:
KthLargest(int k, vector<int> nums) {
for(int i:nums)
{
//使得k值和堆内元素的个数保持一致
q.push(i);
if(q.size()>k)
q.pop();
}
//得到k的值
num=k;
}
int add(int val) {
q.push(val);
if(q.size()>num)
q.pop();
return q.top();
}
private:
priority_queue<int,vector<int>,greater<int>> q;
int num;
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/