力扣:347.前k个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]示例 2:
输入: nums = [1], k = 1
输出: [1]链接:https://leetcode-cn.com/problems/top-k-frequent-elements
思路:
首先用map储存每个元素出现的次数,然后使用优先队列(小顶堆,值小的元素在队首)储存map元素,储存后的优先队列最后k个元素的first就是结果。
优先队列:
class mycmp{
public:
bool operator()(const pair<int,int> &lhs, const pair<int,int> & rhs){
return lhs.second>rhs.second;
}
};
priority_queue<pair<int,int>,vector<pair<int,int>>,mycmp> queue;
代码如下
class Solution {
class mycmp{
public:
bool operator()(const pair<int,int> &lhs, const pair<int,int> & rhs){
return lhs.second>rhs.second;
}
};
public:
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>>,mycmp> queue;
for(unordered_map<int,int>::iterator it = map.begin();it!=map.end();it++){
queue.push(*it);
if(queue.size()>k){//queue队列大于k 则将队首元素弹出
queue.pop();
}
}
vector<int> res;
for(int i =0;i<k;i++){
res.push_back(queue.top().first);
queue.pop();
}
return res;
}
};
执行用时:12 ms, 在所有 C++ 提交中击败了83.90%的用户
内存消耗:13.3 MB, 在所有 C++ 提交中击败了61.79%的用户
通过测试用例:21 / 21