leetcode-347. 前K个高频元素
桶排序
题目详情
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例2:
输入: nums = [1], k = 1
输出: [1]
我的方法:
1.桶排序
顾名思义,桶排序的意思是为每个值设立一个桶,桶内记录这个值出现的次数(或其它属性),然后对桶进行排序。
代码:
class Solution
{
public:
vector<int> topKFrequent(vector<int>& nums, int k)
{
unordered_map<int,int> counts;
int max_count = 0;
for(const int & num : nums) //遍历nums
{
max_count = max(max_count,++counts[num]); //max_count用来记录最高频的数字的频率
//这里++counts[num]实现 "数->频率"的map
}
vector <vector<int>> buckets(max_count + 1); //二维数组的行为最高频
for(const auto & p : counts)
{
//行存频率 //列存该频率的数(可能不止一个)
buckets[p.second].push_back(p.first);
//实现 "频率->数"的buckets
}
vector<int> ans;
for(int i = max_count; i >= 0 && ans.size() < k; --i) //i从高到低遍历k个(因为题目要求的是前K频繁的)
{
for(const int & num : buckets[i]) //这里C++的范围for就很好的跳过了buckets里的空行
{ //比如频率有 5 3 2 1,就跳过了4这一行
ans.push_back(num); //ans存储对应数字
if(ans.size() == k) //够了之后break
{
break;
}
}
}
return ans;
}
};