解题思路:小顶堆顶部存储的是较小的值,从下到达排序的叫小顶堆;我们在小顶堆里面存储够k个元素对应的频次即可;
class mycomparison{
public:
bool operator() ( pair<int,int>& lhs,pair<int,int>& rhs)
{
return lhs.second>rhs.second;//小顶堆,这里要注意,小顶堆的定义方式是">"
}
};//定义一个仿函数来自定义小顶堆的排序顺序
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> mp;
vector<int> ans(k,0);
for(int& num:nums)
{
mp[num]++;
}
//自定义一个小顶堆;
priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparison> pri_que;
for(unordered_map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
{
pri_que.push(*it);
if(pri_que.size()>k)
{
pri_que.pop();
}//如果堆中的元素大于k个就将堆顶的元素弹出
}
for(int i=k-1;i>=0;i--)
{
ans[i]=pri_que.top().first;
pri_que.pop();
}
return ans;
}
};