0.题目说明
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
1.桶排序
桶排序可以参考这篇博客:
https://www.jianshu.com/p/e6ba35133375
桶排序代码如下:
vector<int> bucketSort(vector<int>& nums)
{
vector<int> ret;
int max_num = nums[0];
for (int i = 0; i < nums.size(); i++)
{
if (nums[i]>max_num)
max_num = nums[i];
}
vector<int> bucket(max_num+1);
for (int i = 0; i <bucket.size(); i++)
{
bucket[i]=0;
}
for (int i = 0; i <nums.size(); i++)
{
bucket[nums[i]] ++;
}
int k = 0;
for (int i = 0; i <bucket.size(); i++)
{
if (bucket[i] != 0)
{
nums[k] = i;
k++;
}
}
return bucket;
}
2.利用桶排序计数思想解决此题
这道题我没有完全用桶排序,而是桶计数后利用计数桶,然后返回计数桶中前K个最大值的下标,代码如下:
class Solution {
public:
vector<int> bucketCount(vector<int>& nums) //返回计数完的桶
{
vector<int> ret;
int max_num = nums[0];
int min_num = nums[0];
for (int i = 0; i < nums.size(); i++) //找到数组里最大的数
{
if (nums[i]>max_num)
max_num = nums[i];
}
for (int i = 0; i < nums.size(); i++) //找到数组里最小的数
{
if (nums[i]<min_num)
min_num = nums[i];
}
vector<int> bucket(max_num-min_num+1); //定义桶的大小
for (int i = 0; i <bucket.size(); i++)
{
bucket[i]=0;
}
for (int i = 0; i <nums.size(); i++)
{
bucket[nums[i]-min_num] ++; //在桶中填数
}
return bucket;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
int min_num = nums[0];
for (int i = 0; i < nums.size(); i++) //找到数组里最小的数
{
if (nums[i]<min_num)
min_num = nums[i];
}
vector<int>bucket = bucketCount(nums); //计数完成的桶
vector<int>ret; //存储出现次数最多的前K个数
for (int i = 0; i < k; i++) //桶中前K个最大的数的下标
{
int max = bucket[0];
int max_index = 0;
for (int j = 0; j<bucket.size(); j++)
{
if (bucket[j]>max)
{
max = bucket[j];
max_index = j;
}
}
ret.push_back(max_index+min_num); //桶中第i大的数的下标+min_num即为nums数组中出现次数第i多的数
bucket[max_index]=0; //让桶中这个数变为0
}
return ret;
}
};
我找桶中前K个最大的元素这一步的时候用的是每次找完当前最大元素后,让这个元素等于0,然后再循环找目前最大的元素,所以这种方法比较慢。