1.前 K 个高频元素
图片说明
思路一:小顶堆
图片说明
优先队列的使用https://www.cnblogs.com/huashanqingzhu/p/11040390.html

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<int, int> occurrences;
        for (auto& v : nums) {
            occurrences[v]++;
        }

        // 优先队列,pair 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
        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);
                }//等于k了,一个一个进行对比,如果里面最小的小于新的值,就把最小的放入
            } else {
                q.emplace(num, count);
            }//小于k就按照规则依次放入
        }
        vector<int> ret;
        while (!q.empty()) {
            ret.emplace_back(q.top().first);
            q.pop();
        }
        return ret;
    }
};