leetcode347. 前 K 个高频元素

时间:2019-12-02
本文章向大家介绍leetcode347. 前 K 个高频元素,主要包括leetcode347. 前 K 个高频元素使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目最终需要返回的是前 kk 个频率最大的元素,可以想到借助堆这种数据结构,对于 kk 频率之后的元素不用再去处理,进一步优化时间复杂度。

具体操作为:

借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率
维护一个元素数目为 k 的最小堆
每次都将新的元素与堆顶元素(堆中频率最小的元素)进行比较
如果新的元素的频率比堆顶端的元素大,则弹出堆顶端的元素,将新的元素添加进堆中
最终,堆中的 k 个元素即为前 k个高频元素

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        //建立优先队列
        struct cmp
        {
            bool operator()(const pair<int,int>& p1,const pair<int,int>& p2)
            {
                return p1.second > p2.second;//频次最高的优先级低,放在队尾哈
            }    
        };
        vector<int>res;
        unordered_map<int,int>hashmap;
        priority_queue<pair<int,int>,vector<pair<int,int>>,cmp>pr_qq;

        //建立哈希映射<元素值,出现频次>
        for(int i=0;i<nums.size();i++)
        {
            if(hashmap.count(nums[i])) hashmap[nums[i]]++;
            else
               hashmap.insert(make_pair(nums[i],1));
        }
        auto it=hashmap.begin();
        for(int i=0;it!=hashmap.end()&&i<k;it++,i++)
        {
            pr_qq.push(make_pair(it->first,it->second));
        }        

        for(;it!=hashmap.end();it++)
        {
            pr_qq.push(make_pair(it->first,it->second));
            pr_qq.pop();//弹出去现在频次最低的,也即是队列首部的
        }
        while(!pr_qq.empty())
        {
            res.push_back(pr_qq.top().first);
            pr_qq.pop();
        }
        return res;
       
    }
};

原文地址:https://www.cnblogs.com/renzmin/p/11973585.html