代码随想录:前K个高频元素

代码随想录:前K个高频元素

这个逼优先队列是真不好写啊。

代码从上到下说吧,首先是map,原来这个map能用索引啊,map[i],i即指的键值,而且默认键值对的值是0。

然后说这个优先队列,我只能说以后不想叫这玩意儿队列,因为这玩意儿一来不是个队列,一般是vector做底层,二来使用规范和queue也不一样,是用top的。以后干脆还是叫大根堆小根堆。

然后来讲比较函数,这玩意更是纯逆天,堆排序中默认是大根堆,即less。如果你自己想写比较函数,那你可有罪受了。要重载一个类的operator

class compare{
	operator()(int a,int b)
};

比较函数的含义是,如果第一个元素的优先级在第二个之前,则返回true,如a>b的意思就是,a>b时a的优先级更高,即降序排列。

不过您猜怎么着,这个b堆排序因为底层实现的原因,是反过来的,a>b的时候降序,反而是几把小根堆。

只能说,希望之后别用到这玩意儿。

代码不难如下:

class Solution {
public:
    class compare {
    public:
        bool operator()(pair<int, int> a, pair<int, int> b) {
            return a.second > b.second;
        }
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> target;
        for (int num : nums) {
            auto it = target.find(num);
            if (it != target.end()) {
                it->second++;
            } else {
                target.insert(make_pair(num, 1));
            }
        }

        // 哎这b比较函数太不好写了
        priority_queue<pair<int, int>, vector<pair<int, int>>, compare> que;

        for(auto it:target){
            que.push(it);
            if(que.size()>k){
                que.pop();
            }
        }

        vector<int> res;
        while(!que.empty()){
            res.push_back(que.top().first);
            que.pop();
        }
        return res;
    }
};
posted @ 2024-12-16 21:19  huigugu  阅读(17)  评论(0)    收藏  举报