思路:看到这个题的题解才知道自己有多大的知识窟窿。看代码里的注释!
题解c++:
class Solution {
public:
class mycmp
{
public:
//小顶堆 特点:父节点小于子节点 保证了如果要弹出元素的话弹出的是较小值
bool operator()(const pair<int,int>&left,const pair<int,int>&right)
{
return left.second>right.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> map;
//统计每个数字出现的频率 存到map
for(int i=0;i<nums.size();i++)
{
map[nums[i]]++;
}
//这里的语法乍一看一愣一愣的
//pair<int, int>是pri_que的元素类型,而vector<pair<int, int>>是pri_que的底层容器类型。mycomparison是pri_que的比较器类型 即priority_queue<元素类型,底层容器类型,比较器类型> 名称。
priority_queue<pair<int,int>,vector<pair<int,int>>,mycmp> pri_que;
//超过k个就弹出
for(unordered_map<int,int>::iterator it=map.begin();it!=map.end();it++)
{
pri_que.push(*it);
if(pri_que.size()>k)
{
pri_que.pop();
}
}
//将小顶堆里的结果反向输出,那么就是由大到小的顺序了
vector<int> result(k);
for(int i=k-1;i>=0;i--)
{
result[i]=pri_que.top().first;
pri_que.pop();
}
return result;
}
};