347.前k个高频元素

(写给未来遗忘的自己)

题目:

代码:

class Solution {
public:

//构建一个比较器类 用于比较pair<int,int>类型的对象
class comparison{
    public:
    bool operator()(const pair<int,int>&key_map,const pair<int,int>&value_map){
        //优先队列的排序原则:优先队列的比较器返回true的含义是:左边的元素应该排在右边的元素之后
        return key_map.second>value_map.second;
    }
};
    vector<int> topKFrequent(vector<int>& nums, int k) {
      vector<int>result(k);
      
      //用一个map去处理数组,key存储值,value存储次数;
       std::unordered_map<int,int>map_nums;
        for(int i=0;i<nums.size();i++){
            map_nums[nums[i]]++;
        }
      //自定义一个优先队列 小顶堆
        std::priority_queue<pair<int,int>,vector<pair<int,int>>,comparison>que;】

        for(unordered_map<int,int>::iterator it=map_nums.begin();it!=map_nums.end();it++){
            //it是迭代器,*it 解引用迭代器,获取指向的元素 pair<int,int>
            que.push(*it);

            //维持前k个最大的元素  pop是从栈顶端开始的,所以小顶堆每次弹出的是最小的
            if(que.size()>k){
                que.pop();
            }
        }
        for(int i=k-1;i>=0;i--){
            result[i]=que.top().first;
            que.pop();
        }

        return result;
    }
};

 思路:

1.寻找出现次数最多的元素哦,利用map类型的数据,key存储数据,value存储出现的次数。

2.自定义一个pair<int,int>类型的小顶堆,书写比较器。将按照value进行排序,然后取key的值即为目标值。

知识点:

大顶堆和小顶堆-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值