Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
Example 2:
Input: nums = [1], k = 1
Output: [1]
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.
思路:统计各数的频率可采用hashmap,然后根据频率值使用大顶堆保存最大的k个值。
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> ret;
unordered_map<int,int> mp;
priority_queue<pair<int,int>> pq; //默认大顶堆
for(auto i: nums) mp[i]++;
for(auto q : mp){
pq.push(pair<int,int>(-q.second, q.first));
if(pq.size() > k) pq.pop();
}
while(k--){
ret.push_back(pq.top().second);
pq.pop();
}
//reverse(ret.begin(), ret.end());
return ret;
}
};