《LeetCode刷题笔记-C++》前 K 个高频元素
1、利用unodered_map遍历数组记录各数字的出现频率
2、利用priority_queue实现堆
class Solution {
public:
static bool cmp(pair<int, int> m, pair<int, int> n){
return m.second > n.second;
}
vector<int> topKFrequent(vector<int> nums, int k) {
//unordered_map<Key, T>
//unoredred_map相当于JAVA中的HashMap, unordered_map记录元素的hash值,根据Key的hash值判断
//元素是否相同
//无论从查找、插入上来说,unordered_map的效率都优于hash_map,更优于map;
//而空间复杂度方面,hash_map最低,unordered_map次之,map最大
unordered_map<int, int> occurrences;//Key为nums中的数,T为其出现次数
for(auto& i : nums){
//对于unordered_map,如果访问某Key,这个Key不存在于unordered_map中,
//则会在unordered_map中新建这个Key,新建Key的hash值为0
//此处实现用Key值记录nums中的元素,hash值记录其频率
occurrences[i]++;
}
//decltype(cmp),此处没有用less或greater,而是用了自定义的比较器cmp,构造小顶堆
//模板priority_queue<int, vector<int>, decltype(cmp)> q(cmp);
priority_queue< pair<int, int>, vector< pair<int, int> >, decltype(&cmp) > q(cmp);
for (auto& [num, count] :occurrences){
if (q.size() == k){
if(q.top().second < count){
q.pop();
q.emplace(num, count);
}
}else{
q.emplace(num, count);
}
}
vector<int> res;
while(!q.empty()){
res.push_back(q.top().first);
q.pop();
}
return res;
}
};
优先队列使用自定义比较器的时候,要注意比较器与优先队列定义的格式匹配,这里给出两种形式(参考链接:https://stackoverflow.com/questions/65713719/c-priority-queue-with-custom-type-and-comparator-not-working):
1.如上述代码
2.如下述代码
public:
vector<int> topKFrequent(vector<int> nums, int k) {
auto cmp = [](pair<int, int> m, pair<int, int> n){
return m.second > n.second;
};
priority_queue< pair<int, int>, vector< pair<int, int> >, decltype(cmp) > q(cmp);