前言
打好基础,不求速度,但求质量!!!
一、题目描述
二、详细题解
- 这里用的是计数法,不了解的可以看我以前的博客–排序的博客就详细介绍了这个方法;
- 因为这里的数据有大小限制,所以先搞一个刚刚好包含最大数的数组,最大数就是开的数组大小;把原数组的大小作为刚刚开的数组的下标,然后让刚刚开的数组对应下标的数据加一,注意:初始化刚刚开的数组都为0,这样才好计数;
- 现在已经将原数组的内容作为新数组下标,而新数组的数据内容则是对应下标的个数,所以当新数组的数据为0,则对应下标就不是原数组的内容了!!!
- 再在堆区开辟k个空间,当新数组下标从0开始走,新数组数据不为0的时候,则对应下标是原数组的数据,就可以存放到堆区开辟的空间上了,直到放满k个;
- 也可以使用排序,最好用快排,因为有时间复杂度要求,排好以后直接开始放前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;
}
总结
不追求刷题数量,但求每道题都有质量,都可以学到对象,慢慢成长!!!