leetcode 347 找出数组中最常出现的k个数

class Solution 
{
public:
    using iipair=pair<int,int>;   //定义pair<K,T>的类型别名
    
    class functortocomp           //以函数对象去自定义谓词
    {
        public:
        bool operator()(const iipair& p1,const iipair& p2)
        {
            return p1.second>p2.second;
        }
    };
    vector<int> topKFrequent(vector<int>& nums, int k) 
    {
      unordered_map<int,int> hashtable;  //首先建立散列表并将元素于其频次一一进行嵌入因为不是顺序插入,因此要使用此映射容器
      for(auto t:nums)
          ++hashtable[t];    //对于STL中的散列表而言,因为映射容器定义了operator[]()成员函数,所以其散列地址与关键码的映射可通过索引进行(?整形变量初始为0?)。遍历过后散列表中就形成了关键码(first)与其出现频次(second)的对应关系
       
      priority_queue<iipair,vector<iipair>,functortocomp> minheap;  //建立一个优先级队列,其中第一个参数为元素的类型,第二个参数为使用的基础容器,第三个为谓词;综合来看实际建立了一个以频次为导向的小顶堆
      for(auto t:hashtable)
      {
          if(minheap.size()<k)
              minheap.push(t);
          else if(minheap.size()==k)
          {
              /***!!注:因为这里要将待插入元素与堆中最小元素进行对比,且priority_queue不同与queue,不能访问末尾(即堆底)元素,因此不能建立最大堆!!**/
               //只插入那些频数大于小顶堆堆顶频数的pair(隐含着先到先得,即即使两个数出现的频次一样,但是先到者先得)// 
              if(minheap.top().second<t.second)                         
              {
                  minheap.push(t);
                  minheap.pop();
              }                  
          }
      }
      vector<int> findk(k,0);
      for(int i=0;i<k;i++)
      {
         findk[i]=minheap.top().first;
         minheap.pop();
      }
      return findk;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值