题目描述
- 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
解题分析
class Solution {
public:
//堆思想 建立出现次数数组
//若堆的元素个数<k 可以直接插入堆中
//堆的元素个数>=k 则检查堆定于当前出现次数的大小
//若堆顶更大,说明至少有k个数字的出现次数比当前值大,舍弃当前值
//否则 弹出堆顶 将当前值插入堆
//布尔函数 判断对组里哪个第二个值大
static bool cmp(pair<int,int>& m,pair<int,int>& n)
{
return m.second > n.second;
}
vector<int> topKFrequent(vector<int>& nums, int k)
{
//建立哈希表 记录没和数字出现的次数
unordered_map<int,int> occurrences;
for(auto& v: nums)
{
occurrences[v]++;//每出现一次 次数加一次
}
//pair第一个元素代表数组的值 第二个元素代表出现次数
//优先队列 元素被赋予优先级 当访问元素时 具有最高优先级的元素最先被删除
//定义:priority_queue<Type, Container, Functional>
//decltype的主要用于声明模板函数,此模板函数的返回值类型依赖于其参数类型
priority_queue<pair<int,int>,vector<pair<int,int>>, decltype(&cmp)> q(cmp);
for( auto& [num,count]:occurrences)
{
if(q.size() ==k)
{
//堆顶元素个数更小 弹出堆顶 插入新值
if(q.top().second < count)
{
q.pop();//移除堆顶
q.emplace(num,count);
}
}
//堆顶元素不为k 直接插入
else
{
q.emplace(num,count);
}
}
vector<int> ret;
while(!q.empty())
{
ret.emplace_back(q.top().first);//插入元素值
q.pop();
}
return ret;
}
};