• 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;
           
        }
    };
  • 相关阅读:
    创建一个Flex工程
    WebORB手动配置要点
    热血三国地图增强版
    vs2008 sp1无法加载实体模型工具的解决办法
    Berkeley DB for .NET使用
    FluorineFx使用自定义VO(实现IExternalizable接口)
    PD生成数据表时出现“未能准备语句”
    替换AsWing的JTree组件中的图标
    参数传递
    c# 32位16位MD5加密
  • 原文地址:https://www.cnblogs.com/renzmin/p/11973585.html
Copyright © 2020-2023  润新知