解法1:
思路:一共要解决3个问题:统计每个元素出现的次数;按照元素出现的次数高低进行排序 ;输出前k个出现次数最高的元素组成的数组。
第一个问题,可以用map来解决。创建一个容器map,遍历nums,map的first储存元素,second储存元素次数。
第二个问题,用优先队列来解决。创建一个队列q,对q的要求:内部储存pair类型;是一个小顶堆,也就是优先输出最小值;写一个仿函数定义比较方式,通过比较pair的second来排序。然后开始遍历map,最后输出的q中就是含有k个元素的小顶堆。
第三个问题,创建一个数组result,依次将q中元素的first输入result,输出result。
class Solution {
public:
class macomparison{
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) {
unordered_map<int,int> map;
for(int i = 0; i<nums.size(); i++) {
map[nums[i]]++;
}
priority_queue<pair<int,int>,vector<pair<int,int>>,macomparison> q;
for(unordered_map<int,int>::iterator it=map.begin();it != map.end();it++){
q.push(*it);
if(q.size() > k){
q.pop();
}
}
vector<int> result(k);
for(int i = k - 1;i>=0;i--){
result[i] = q.top().first;
q.pop();
}
return result;
}
};