给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 https://leetcode.cn/problems/top-k-frequent-elements/description/

   class Solution {
    public:

        class mygreater{
            public:
                bool operator()(const pair<int, int> &pair1, const pair<int, int> &pair2) {
                    return pair1.second > pair2.second;
                }
        };
        
        vector<int> topKFrequent(vector<int>& nums, int k) {
            // 获取元素出现频率
            unordered_map<int, int> umap;
            for(auto &tmp : nums) {
                umap[tmp]++;
            } 

            // 将元素和出现频率建立k个元素的小根堆
            priority_queue<pair<int, int>, vector<pair<int, int>>, mygreater> pq;
            for(auto i = umap.begin(); i != umap.end(); i++) { //不能用<
                pq.push(*i); 
                if (pq.size() > k){
                    pq.pop();
                }
            }
            vector<int> result;
            // 将小根堆内元素存到result中
            while(!pq.empty()) {
                result.push_back(pq.top().first);
                pq.pop();
            }
            return result;
        }
}; 

笔记

  1. priority_queue : C++标准库中的一个容器适配器,它基于堆(heap)数据结构实现,用于创建一个优先队列。优先队列是一种特殊的队列,其中元素被赋予优先级,按照优先级从高到低的顺序进行排序,允许高优先级的元素先出队。

  2. 用迭代器遍历时候循环条件要用!= xx.end(), 而不是 < 。

  3. priority_queue 的模板要求比较函数必须以类对象的形式存在,而不是直接的函数指针。且类不需要实例化,直接把类名放进去。