leetcode——第347题——自己写不出来的 top-K 优先级队列+小顶堆+unordered_map

题目:
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按任意顺序返回答案。

class Solution {
public:
    // 这里就是实现小顶堆
    class mycomparison
    {
    public:
        bool operator()(const pair<int,int>& lhs,const pair<int,int>& rhs)
        {
            return lhs.second>rhs.second;
        }
    };

    vector<int> topKFrequent(vector<int>& nums, int k) {
        // 第一步:统计元素出现的频率
        // unorder_map存取效率最好,map<元素值,对应次数>
        unordered_map<int,int> map;
        for(int i=0;i<nums.size();i++)
        {
            // 在对应的 key=nums[i] 的 value 实现 +1
            map[nums[i]]++; 
        }
        // 第二步:对频率排序
        // 定义一个小顶堆,大小为 K
        // ?????????????????这里不懂哦~疑问1????????????????
    priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparison> pri_que;

        // 用固定大小为 k 的小顶堆,扫描所有频率的数值
    // ??????????扫描的是map类型,所有要传入迭代器,迭代器依次+1
    for(unordered_map<int,int>::iterator it=map.begin();it != map.end(); it++)
        {
            // push 的时候记得解引用,因为it 是迭代器
            pri_que.push(*it);
            // 如果堆的大小大于了 K,则队列弹出,保证堆的大小一直为 K
            if(pri_que.size() > k)
            {
                pri_que.pop();
            }
        }

        // 找出前 K 个高频元素,因为小顶堆先弹出的是最小的,所有倒叙来输出到数组
        // 定义大小为k 的一个数组存放最终结果
        vector<int> result(k);
        for(int i=k-1; i>=0; i--)
        {
            // pri_que里面存放的元素是一个 对组 的形式,我们要的是 key 值
            // 也就是对组中的 first 元素
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值