这里思路是堆排序,而且是小根堆。C++中包含在头文件<queue>的priority_queue本质就是堆排序实现的。其中priority_queue函数原型是
priority_queue<Type, Container, Functional>
Type 就是数据类型,
Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),
Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大根堆 。
//降序队列(大根堆)
priority_queue <int,vector<int>,less<int> >q;
priority_queue <int,vector<int>,less<int> >q;
//升序队列(小根堆)
priority_queue <int,vector<int>,greater<int> > q;
priority_queue <int,vector<int>,greater<int> > q;
另外,greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
本题代码如下:
class KthLargest { private: priority_queue<int, vector<int>, greater<int>> heap; int size; public: KthLargest(int k, vector<int> nums) { size=k; for (int i = 0; i < nums.size(); i++){ heap.push(nums[i]); if(heap.size()>k) heap.pop(); } } int add(int val) { heap.push(val); if(heap.size()>size) heap.pop(); return heap.top(); } }; /** * Your KthLargest object will be instantiated and called as such: * KthLargest obj = new KthLargest(k, nums); * int param_1 = obj.add(val); */
参考:https://www.cnblogs.com/paulprayer/p/9855940.html