给定一个非空的整数数组,返回其中出现频率前 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进行排列。