zoukankan      html  css  js  c++  java
  • LeetCode347 前k个高频元素

    给定一个非空的整数数组,返回其中出现频率前 高的元素。

    用最小堆解决。先用map记录每个元素的出现次数,然后循环往最小堆中压入,如果堆中节点数量大于k了就弹出堆顶。

     1 class Solution {
     2 public:
     3     vector<int> topKFrequent(vector<int>& nums, int k) {
     4         unordered_map<int,int> map;
     5         for(int i : nums) map[i] ++; //遍历
     6         priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > q; //最小堆
     7         for(auto it : map) 
     8             if(q.size() == k) { //队列满了
     9                 if(it.second > q.top().first) { //堆排
    10                     q.pop();
    11                     q.push(make_pair(it.second, it.first));
    12                 }
    13             }
    14             else q.push(make_pair(it.second, it.first));
    15         vector<int> res;
    16         while(q.size()) { //将优先队列中k个高频元素存入vector
    17             res.push_back(q.top().second);
    18             q.pop();
    19         }
    20         return vector<int>(res.rbegin(), res.rend());
    21     }
    22 };
    23 
    24 作者:OrangeMan
    25 链接:https://leetcode-cn.com/problems/top-k-frequent-elements/solution/cjian-ji-dai-ma-by-orangeman-5/
    26 来源:力扣(LeetCode)
    27 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    这里压入堆中的时候需要反过来压入<second,first>,应该是因为优先队列会根据里面的pair的first进行排列。

  • 相关阅读:
    CF547D Mike and Fish
    CF147B Smile House
    [BJOI2017]树的难题
    AT2306 Rearranging
    复利计算器--单元测试
    操作系统 实验1 命令解释程序的编写
    个人项目耗时对比记录表
    复利计算器3.0
    0320记《构建之法》读后感
    复利计算实验总结
  • 原文地址:https://www.cnblogs.com/rookiez/p/13334865.html
Copyright © 2011-2022 走看看