347.前K个高频元素.结构体数组排序

题目

 

链接: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;
}

时间空间复杂度

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值