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进行排列。

 

posted @ 2020-07-18 10:48  __rookie  阅读(191)  评论(0编辑  收藏  举报