【牛客刷题】最小的k个数


前言

打好基础,不求速度,但求质量!!!


一、题目描述

在这里插入图片描述

二、详细题解

  1. 这里用的是计数法,不了解的可以看我以前的博客–排序的博客就详细介绍了这个方法;
  2. 因为这里的数据有大小限制,所以先搞一个刚刚好包含最大数的数组,最大数就是开的数组大小;把原数组的大小作为刚刚开的数组的下标,然后让刚刚开的数组对应下标的数据加一,注意:初始化刚刚开的数组都为0,这样才好计数;
  3. 现在已经将原数组的内容作为新数组下标,而新数组的数据内容则是对应下标的个数,所以当新数组的数据为0,则对应下标就不是原数组的内容了!!!
  4. 再在堆区开辟k个空间,当新数组下标从0开始走,新数组数据不为0的时候,则对应下标是原数组的数据,就可以存放到堆区开辟的空间上了,直到放满k个;
  5. 也可以使用排序,最好用快排,因为有时间复杂度要求,排好以后直接开始放前k个数据到开好的堆区空间上就行了;这个是第二个方法!!!

三. 代码实现

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param input int整型一维数组 
 * @param inputLen int input数组长度
 * @param k int整型 
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
    // write code here
    if(k==0)
    return NULL;
    *returnSize=k;
    int* ret=(int*)calloc(sizeof(int),k);
    if(ret==NULL){
        perror("calloc fail");
        exit(-1);
    }
    int i=0;
    int arr[1001]={0};
    for(i=0;i<inputLen;++i){
        arr[input[i]]++;
    }
    int j=0;
    for(i=0;i<1001;++i){
        if(j==k)
        break;
        if(arr[i]>0){
           while(arr[i]--){
               if(j==k)
               goto again;
           ret[j++]=i;
           }
        }
    }
    again:
    return ret;
}

总结

不追求刷题数量,但求每道题都有质量,都可以学到对象,慢慢成长!!!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值