题目
链接:https://leetcode.cn/problems/top-k-frequent-elements/solution/by-xun-ge-v-5oea/
示例
思路
需要寻找出现次数最多的数
我们先对数组进行排序,然后将数组中出现的元素保存在结构体中,对数组进行简化
//定义结构体,记录数字及其出现的次数
struct Times{
int num;//数组元素
int cnt;//出现次数
};
保存自身元素和出现次数,最后再对结构体数组进行降序排序,寻找前k个元素进行输出
代码
//定义结构体,记录数字及其出现的次数
struct Times{
int num;//数组元素
int cnt;//出现次数
};
//用于初始数组nums的排序
int cmp(const void* a,const void* b){
return *(int*)a - *(int*)b;
}
//用于结构体的一级排序
int cmps(const void* a,const void* b){
return (*(struct Times*)b).cnt - (*(struct Times*)a).cnt;
}
/*
*int* topKFrequent(int* nums, int numsSize, int k, int* returnSize)
int* topKFrequent:寻找数组中元素出现次数最多的k个
int* nums:数组
int numsSize:数组长度
int k:出现次数前k个
int* returnSize:返回数组长度
返回值:出现次数最多的k个元素
*/
int* topKFrequent(int* nums, int numsSize, int k, int* returnSize){
*returnSize = k;
int* res = (int*)malloc(sizeof(int)*k);
struct Times time[numsSize];
int index=0;
//1.对初始数组nums进行排序
qsort(nums,numsSize,sizeof(int),cmp);
//2.遍历计算各个数字出现的次数
time[index].num = nums[0];
time[index].cnt = 1;
for(int i=1;i<numsSize;i++){
if(nums[i]==nums[i-1])time[index].cnt++;
else{
time[++index].num = nums[i];
time[index].cnt = 1;
}
}
//3.对结构体数组按出现次数降序排序
qsort(time,index+1,sizeof(struct Times),cmps);
//4.返回前k个数字
for(int i=0;i<k;i++){
res[i] = time[i].num;
}
return res;
}
时间空间复杂度