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.
Subscribe to see which companies asked this question.
思路:比较直观的想法是用Hash Table统计元素个数,然后用堆来找出前K个数量最多的元素。priority_queue默认是大根堆,所以可以将<计数-元素>对直接存入堆中。
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> hash;
priority_queue<pair<int,int>> heap;
vector<int> ret;
for(int num:nums)
hash[num]++;
for(auto it:hash)
heap.push(make_pair(it.second, it.first));
for(int i=0; i<k; ++i) {
ret.push_back(heap.top().second);
heap.pop();
}
return ret;
}
};