347. 前 K 个高频元素
问题
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
分析
哈希表记录每个元素出现次数,然而,无法排序,所以还要再用一个数据结构,堆,将哈希表中的pair再存一遍即可。
注意,priority_queue 的第三个模板参数是比较器的类型(例如 greater<int> 或 decltype(&cmp)),构造时需要用 () 传递一个该类型的实例对象(比较器本身)。std::sort 的第三个参数是比较器对象本身,可以是函数名(自动退化为函数指针)、lambda 表达式,或函数对象,直接传值即可,不需要在模板中指定类型。
代码
class Solution {
public:
unordered_map<int, int> um;
int n_n = 0;
vector<int> res;
static bool cmp(pair<int, int> p1, pair<int, int> p2) {
return p1.second < p2.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
n_n = nums.size();
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> pq(cmp);
for (int i = 0; i < n_n; i++) {
um[nums[i]]++;
}
for (unordered_map<int, int>::iterator it = um.begin(); it != um.end(); it++) {
pq.push(*it);
}
for (int i = 0; i < k; i++) {
res.push_back(pq.top().first);
pq.pop();
}
return res;
}
};

浙公网安备 33010602011771号