347.前k个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 https://leetcode.cn/problems/top-k-frequent-elements/description/
class Solution {
public:
class mygreater{
public:
bool operator()(const pair<int, int> &pair1, const pair<int, int> &pair2) {
return pair1.second > pair2.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
// 获取元素出现频率
unordered_map<int, int> umap;
for(auto &tmp : nums) {
umap[tmp]++;
}
// 将元素和出现频率建立k个元素的小根堆
priority_queue<pair<int, int>, vector<pair<int, int>>, mygreater> pq;
for(auto i = umap.begin(); i != umap.end(); i++) { //不能用<
pq.push(*i);
if (pq.size() > k){
pq.pop();
}
}
vector<int> result;
// 将小根堆内元素存到result中
while(!pq.empty()) {
result.push_back(pq.top().first);
pq.pop();
}
return result;
}
};
笔记
-
priority_queue : C++标准库中的一个容器适配器,它基于堆(heap)数据结构实现,用于创建一个优先队列。优先队列是一种特殊的队列,其中元素被赋予优先级,按照优先级从高到低的顺序进行排序,允许高优先级的元素先出队。
-
用迭代器遍历时候循环条件要用!= xx.end(), 而不是 < 。
-
priority_queue 的模板要求比较函数必须以类对象的形式存在,而不是直接的函数指针。且类不需要实例化,直接把类名放进去。