在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列是一个队列,具有队列的所有特性,包括队列的基本操作,在这基础上添加了内部的一个排序(堆排序),它本质是一个堆实现的。
priority_queue<Type, Container, Functional>
当需要用自定义的数据类型时才需要传入 Type, Container, Functional 这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
Type: 数据类型
Container: 容器类型(Container必须是用数组实现的容器,比如vector, deque等等,但不能用 list,STL 里面默认用的是 vector)
Functional: 比较的方式
// 升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;
// 降序队列,大顶堆
priority_queue <int,vector<int>,less<int> >q;
// 对于基础类型 默认是大顶堆
// 等同于 priority_queue<int, vector<int>, less<int> > a;
priority_queue<int> a;
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> res;
unordered_map<int, int> freq;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
for (auto num : nums) ++freq[num];
for (auto& pair : freq) {
pq.emplace(pair.second, pair.first);
if (pq.size() > k) pq.pop();
}
while (!pq.empty()) {
res.emplace_back(pq.top().second);
pq.pop();
}
return res;
}
};