题目:
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按任意顺序返回答案。
class Solution {
public:
// 这里就是实现小顶堆
class mycomparison
{
public:
bool operator()(const pair<int,int>& lhs,const pair<int,int>& rhs)
{
return lhs.second>rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
// 第一步:统计元素出现的频率
// unorder_map存取效率最好,map<元素值,对应次数>
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++)
{
// 在对应的 key=nums[i] 的 value 实现 +1
map[nums[i]]++;
}
// 第二步:对频率排序
// 定义一个小顶堆,大小为 K
// ?????????????????这里不懂哦~疑问1????????????????
priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparison> pri_que;
// 用固定大小为 k 的小顶堆,扫描所有频率的数值
// ??????????扫描的是map类型,所有要传入迭代器,迭代器依次+1
for(unordered_map<int,int>::iterator it=map.begin();it != map.end(); it++)
{
// push 的时候记得解引用,因为it 是迭代器
pri_que.push(*it);
// 如果堆的大小大于了 K,则队列弹出,保证堆的大小一直为 K
if(pri_que.size() > k)
{
pri_que.pop();
}
}
// 找出前 K 个高频元素,因为小顶堆先弹出的是最小的,所有倒叙来输出到数组
// 定义大小为k 的一个数组存放最终结果
vector<int> result(k);
for(int i=k-1; i>=0; i--)
{
// pri_que里面存放的元素是一个 对组 的形式,我们要的是 key 值
// 也就是对组中的 first 元素
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};