原题目:https://leetcode-cn.com/problems/top-k-frequent-elements/
思路1:
用哈希表存储值和出现的次数,然后转化为vector,排序,取前k个就好了
代码:
class Solution {
public:
static bool cmp(pair< int,int> &a,pair<int,int> &b){
return a.second>b.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int,int>m;
for(int i: nums) m[i] ++;
vector<pair<int,int>> v(m.begin(),m.end());
sort(v.begin(),v.end(),cmp);
vector<int> ans;
for(auto i:v){
if(k--<=0) break;
ans.push_back(i.first);
}
return ans;
}
};
思路二:
使用小顶堆,实现前k大。当堆的个数大于k时,pop()
细节:我们可以对出现的频率取相反数,这样建立的堆就是我们想要的小顶堆。
要点:实现前k大用小顶堆,实现前k小,用大顶堆
代码:
// 求前k大,用小顶堆,求前k小,用大顶堆.
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> ret;
unordered_map<int, int> mp;
// 默认为大顶堆
priority_queue<pair<int, int>> pq;
for (auto i : nums) mp[i]++;
for (auto p : mp) {
pq.push(pair<int, int>(-p.second, p.first));
if (pq.size() > k) pq.pop();
}
while (k--) {
ret.push_back(pq.top().second);
pq.pop();
}
return ret;
}
};