【LeetCode-347】前 K 个高频元素

问题

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

解答

class Solution {
public:
    typedef pair<int, int> P; // 少写点字
    struct cmp {bool operator()(P a,P b) {return a.second > b.second;}}; // 自定义优先队列排序
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> ump;
        priority_queue<P, vector<P>, cmp> pq;
        vector<int> res;
        for (int i : nums) ump[i]++;
        for (auto [f, s] : ump) {
            if (pq.size() < k || pq.top().second < s) pq.push(make_pair(f, s));
            if (pq.size() > k) pq.pop();
        }
        while (!pq.empty()) {
            res.push_back(pq.top().first);
            pq.pop();
        }
        return res;
    }
};

重点思路

典型的TopK问题,可以使用最大堆最小堆来解决。本文要求的是频数的最大K,那么我们可以把数字与其出现的次数构成一个pair,求频数的最大值,然后通过pair输出频数对应的数字。这里有一个知识点是优先队列的自定义排序。需要注意的是这里不能像sort函数之类的直接用lambda函数,优先队列默认为最大堆,可以看做队列越往后越大,自定义排序可以定义为a < b;如果要使用最小堆,越往后越小,则定义为a > b

posted @ 2021-03-11 15:24  tmpUser  阅读(38)  评论(0编辑  收藏  举报