题目:
Given a non-empty array of integers, return the k most frequent elements.
思路1:用unordered_map对各个元素进行计数,用priority_queue找到第k大的元素,然后从头到尾遍历unordered_map即可出答案。
思路2:用unordered_map对各个元素进行计数,buckets根据不同的出现次数对元素进行分类存放。
代码实现:
思路1:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> counts;
priority_queue<int, vector<int>, greater<int>> max_k; // 建立一个小堆,选取最大的k个元素
for (int i = 0; i < nums.size(); ++i){
++counts[nums[i]];
}
for (auto & i : counts){
max_k.push(i.second);
while (max_k.size() > k){ // 保证只留下k个最大元素
max_k.pop();
}
}
vector<int> ans;
for (auto & i : counts){
if (i.second >= max_k.top()){
ans.push_back(i.first);
}
}
return ans;
}
};
思路2:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> counts;
for (int i = 0; i < nums.size(); ++i){
++counts[nums[i]];
}
vector<vector<int>> buckets(nums.size()+1);
for (auto & k : counts){
buckets[k.second].push_back(k.first);
}
reverse(buckets.begin(), buckets.end());
vector<int> ans;
for (auto & bucket : buckets){
for (auto & e : bucket){
ans.push_back(e);
if (ans.size() >= k){
return ans;
}
}
}
return ans;
}
};