1.优先队列
构建最小堆,记录k个出现次数最高的元素
代码如下:
class Solution {
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> minHeap;
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
//维护一个最小堆,堆的大小为k,存放出现频率前K高的元素
map<int,int> m;
for(int i=0;i<nums.size();i++)
m[nums[i]]++;//使用map对出现的次数计数 元素--次数
map<int,int>::iterator iter=m.begin();
while(iter!=m.end())
{
minHeap.push({iter->second,iter->first});//以次数--元素的形式放入队列中,队列中按出现次数升序排列
if(minHeap.size()>k) //如果大小大于k,则删除队首出现次数最少的
minHeap.pop();
iter++;
}
vector<int> res(k);
while(k--)
{
res[k]=minHeap.top().second;//记录该元素
minHeap.pop();
}
return res;
}
};