Given [1,1,1,2,2,3]
and k = 2, return [1,2]
.
用一个map容器记下每个元素出现的次数,再用优先级队列按从大到小存下Map的元素
class Solution {
typedef pair<int, int> data;
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int,int> mapint;
priority_queue<data, vector<data>, greater<data>> heap;
vector<int> re;
vector<int> res;
for(int i=0;i<nums.size();i++) // 统计每个元素的个数
{
if(mapint.find(nums[i])==mapint.end())
mapint[nums[i]]=1;
else mapint[nums[i]]++;
}
for(auto it:mapint) {
heap.push(make_pair(it.second, it.first));
if(heap.size() > k) heap.pop();
}
while(!heap.empty())
{
re.push_back(heap.top().second);
heap.pop();
}
for(int i=re.size()-1;i>=0;i--)
{
res.push_back(re[i]);
}
return res;
}
};
网上较优的代码
class Solution {
typedef pair<int, int> data;
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> hash;
priority_queue<data, vector<data>, greater<data>> heap;
vector<int> ret;
for(int num:nums)
hash[num]++;
for(auto it:hash) {
heap.push(make_pair(it.second, it.first));
if(heap.size() > k) heap.pop();
}
while(!heap.empty()) {
ret.push_back(heap.top().second);
heap.pop();
}
return ret;
}
};
用排列桶
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> hash;
vector<vector<int>> buckets(nums.size()+1);
vector<int> ret;
for(int num:nums)
hash[num]++;
for(auto it:hash)
buckets[it.second].push_back(it.first);
for(int i=buckets.size()-1; i>0; --i) {
for(auto num:buckets[i]) {
ret.push_back(num);
if(ret.size() == k) return ret;
}
}
return ret;
}
};