(leetcode题解)Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements.
For example,
Given [1,1,1,2,2,3]
and k = 2, return [1,2]
.
Note:
- You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
- Your algorithm's time complexity must be better than O(n log n), where n is the array's size.
对于这种统计出现个数的题目,一般用map或unordered_map进行统计先,我开始的想法是通过统计之后,再用sort函数对pair的second进行排序输出,不过在leetcode的编译器一直不能识别重新定义的比较算法,我试着在本地ide上运行是可以通过的。
贴出C++代码:
//重新定义的比较函数 bool compete(const pair<int,int>& a,const pair<int,int>& b) { return a.second > b.second; } vector<int> topKFrequent(vector<int>& nums, int k) { map<int,int> vec; vector<int> res; vector<pair<int,int>> m_pair; for(int i=1;i<nums.size();i++) { vec[nums[i]]++; } for(auto &i:vec) m_pair.push_back(i); sort(m_pair.begin(),m_pair.end(),compete); //通过比较second排序 auto iter=m_pair.begin(); for(int i=0;i<k;i++) { res.push_back(iter->first); iter++; } return res; }
之后我改为优先队列,即统计个数之后,用优先队列对pair的second进行排序,再输出前k个即可,代码如下
vector<int> topKFrequent(vector<int>& nums, int k) { map<int,int> vec; vector<int> res; priority_queue<pair<int,int>> p; for(int i=0;i<nums.size();i++) { vec[nums[i]]++; } for(auto &i:vec) p.push(make_pair(i.second,i.first)); //比较的是second for(int i=0;i<k;i++) { res.push_back(p.top().second); p.pop(); } return res; }