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;
    }
};
posted @ 2025-06-18 23:52  saulstavo  阅读(13)  评论(0)    收藏  举报