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

文章目录

  • 前言
  • 一、题目描述
  • 二、详细题解
  • 三. 代码实现
  • 总结


前言

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


一、题目描述

【牛客刷题】最小的k个数_第1张图片

二、详细题解

  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;
}

总结

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

你可能感兴趣的:(牛客网刷题,算法,c语言,数据结构)