
法一:纯哈希表
思路:用map记录每个元素出现的次数,自己定义map函数按照value值排序,前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> map;
for(int n : nums){
map[n]++;
}
vector<pair<int, int>> vec(map.begin(), map.end());
sort(vec.begin(), vec.end(), cmp);
vector<int> res;
for(int i = 0; i < k; i++){
res.push_back(vec[i].first);
}
return res;
}
};
注意cmp函数前需要加static,不然会出错。我的理解是sort函数通过类的调用,第三个参数应该调用一个non static函数。
具体原因参考
法二:map+优先队列
思路:用优先队列维护按照出现次数排序
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> map;
for(int n : nums){
map[n]++;
}
priority_queue<pair<int, int>> q;
for(auto i = map.begin(); i != map.end(); i++){
q.push({i -> second, i -> first});
}
vector<int> res;
for(int i = 0; i < k; i++){
res.push_back(q.top().second);
q.pop();
}
return res;
}
};
注:官方题解用的都是小顶堆,我是用大顶堆写的,性能上应该不如小顶堆。