leetcode 347. 前 K 个高频元素
顾名思义,桶排序的意思是为每个值设立一个桶,桶内记录这个值出现的次数(或其它属
性),然后对桶进行排序。
红色代表频率。
最后,我们从后往前遍历,直到找到k个旧桶。
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
// 使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值
unordered_map<int, int> counts;
int max_count = 0; // 最大的频率,可作为后面数组的大小
for (auto& num: nums) {
max_count = max(max_count, ++counts[num]);
}
//桶排序
//将频率作为数组下标,对于出现频率不同的数字集合,存入对应的数组下标
vector<vector<int>> bucket(max_count+1);
for (auto& p: counts) {
bucket[p.second].push_back(p.first);
}
// 倒序遍历数组获取出现顺序从大到小的排列
vector<int> ans;
for (int i = max_count; i >= 0; --i) {
for (auto& num: bucket[i]){
ans.push_back(num);
}
if (ans.size() == k) {
break;
}
}
return ans;
}
};