总体思路:使用桶排序,首先对数组中的每个元素出现频率使用哈希表存储。然后再以频率为下标,数字为元素,将这些信息再存储下来。之后对下标从大到小遍历出k个即可。
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> counts; // 记录每个元素出现的频率。
int max_counts = 0;
for (const int & num : nums) {
max_counts = max(max_counts, ++counts[num]);
}
// vector<vector<int>> buckets[max_counts + 1]; // []括号会导致buckets未定义为vector,从而后面的Push_back报错,但leetcode无法检测出这个错误。
vector<vector<int>> buckets(max_counts + 1); // 用于按照频率存储数组元素。vector下标是频率。
for (const auto & p : counts) {
buckets[p.second].push_back(p.first);
}
vector<int> ans;
for (int i = max_counts; i >= 0 && ans.size() < k; i--) {
for (const int & num : buckets[i]) {
ans.push_back(num);
}
}
return ans;
}
};