给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。
数据范围:
,数组中每个数的大小
要求:空间复杂度
,时间复杂度
[4,5,1,6,2,7,3,8],4
[1,2,3,4]
返回最小的4个数即可,返回[1,3,2,4]也可以
[1],0
[]
[0,1,2,1,2],3
[0,1,1]
int cmp(const void *a, const void *b) {
return *(int*)a > *(int*)b? 1: -1;
}
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
qsort(input, inputLen, sizeof(int), cmp);
*returnSize = k;
return input;
} int result[10000];
/* 找出最小值并且把这个值移出数组*/
int GetMinNum(int* input, int inputlen){
int tmp = input[0];
int index = 0;
for (int m = 1; m < inputlen; m++){
if (tmp > input[m]){
tmp = input[m];
index = m;
}
}
for (int n = index; n < inputlen-1; n++)
{
input[n] = input[n+1];
}
return tmp;
}
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
// write code here
for (int i = 0; i < k; i++){
result[i] = GetMinNum(input,inputLen);
inputLen--;
}
*returnSize = k;
return result;
} #include <stdbool.h>
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
if(k == 0){
return NULL;
}
int **tmp1 = malloc(sizeof(int*) * 10);
//数组长度标志
int flag[10] = {0};
int i;
for(i = 0 ;i<10;i++){
tmp1[i] = malloc(sizeof(int) * inputLen);
}
int max = 0;
for(i = 0;i<inputLen ;i++){
if(input[i] > max){
max = input[i];
}
}
//基数排序思路
//计算位数
int ctn = 10;
while(max/ctn!=0){
ctn = ctn * 10;
}ctn = ctn/10;
int ctn2 = 1;
while(ctn2<=ctn){
//从低位到高位存储数字
for(i = 0;i<inputLen;i++){
int index = input[i]/ctn2 % 10;
tmp1[index][flag[index]] = input[i];
flag[index]++;
}i = 0;
inputLen = 0;
int j = 0;
while(j<10){
if(i >=flag[j]){
j++;
i = 0;
continue;
}
input[inputLen++] = tmp1[j][i++];
}i = 0;j = 0;
//重置数组长度;
while(i<10){
flag[i] = 0;
i++;
}i = 0;
ctn2 = ctn2*10;
}
*returnSize = k;
return input;
} int privot(int a[], int low, int high);
void quicksort(int a[], int low, int high);
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
// write code here
int i;
int *traget = (int *)malloc(sizeof(int)*k); //创造返回的数组
if (k == 0) return NULL;
quicksort(input, 0, inputLen-1);
for (i = 0; i < k; i++){ //赋值最小的k个
traget[i] = input[i];
}
*returnSize = i;
return traget;
}
int privot(int a[], int low, int high){ //划分
int p = a[low];
while (low < high){
while(low < high && a[high] >= p) high--;
a[low] = a[high];
while(low < high && a[low] <= p) low++;
a[high] = a[low];
}
a[low] = p;
return low;
}
void quicksort(int a[], int low, int high){ //快排
if (low < high) {
int pri = privot(a, low, high);
quicksort(a, low, pri-1);
quicksort(a, pri+1, high);
}
} void heapAdjust(int* arr,int i,int n){
int rc=arr[i];//将以序号为i的结点为根结点的子树建成堆
for(int j=i*2+1;j<n;j=j*2+1){//i是双亲结点,j是孩子结点
if(j<n-1 && arr[j]<arr[j+1])//j如果不是最后一个结点,则有右孩子
j++;//右孩子较大
if(rc>=arr[j])//建立大根堆
break;
arr[i]=arr[j];
i=j;
}
arr[i]=rc;
}
void createHeap(int* arr,int n){
for(int i=n/2-1;i>=0;i--)
heapAdjust(arr,i,n);
}
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
*returnSize=0;
if(inputLen==0)
return NULL;
*returnSize=k;
createHeap(input,k);//数组前k个元素初建大根堆
int i;
for(i=k;i<inputLen;i++){//从数组下标k开始,依次和前面已经建好的堆顶元素相比较
if(input[i]<input[0]){
int tmp=input[0];
input[0]=input[i];
input[i]=tmp;
heapAdjust(input,0,k);//重新调整
}
}
int* res=(int *)malloc(sizeof(int)*k);
for(i=0;i<k;i++)
res[i]=input[i];
return res;
} int findmaxnum(int* input, int inputLen) {
int max = 0;;
for(int i = 1; i < inputLen; i++) {
max = (input[i] > input[max] ? i : max);
}
return max;
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @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
*returnSize = k;
for(int i = k; i < inputLen; i++) {
int max = findmaxnum(input, k);
if(input[i] < input[max]) {
int temp = input[i];
input[i] = input[max];
input[max] = temp;
}
}
for(int i = 0; i < k; i++)
{
for(int j = 0; j < k - i - 1; j++)
{
if(input[j] > input[j+1])
{
int temp = input[j];
input[j] = input[j+1];
input[j+1] = temp;
}
}
}
return input;
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param input int整型一维数组
* @param inputLen int input数组长度
* @param k int整型
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*/
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
// write code here
*returnSize=k;
qsort(input, inputLen,sizeof(int), comp);
return input;
} /**
------------------已验证可以通过--------------------------
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param input int整型一维数组
* @param inputLen int input数组长度
* @param k int整型
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
typedef struct alog
{
int(*find_min)( int*, int);
int*(*min_array)(struct alog, int*,int, int);
}alog_find_minarray;
static int find_min( int* inbuf, int len)
{
int cnt;
int minval = 1000;
int minid = 0;
for(cnt=0;cnt<len;cnt++){
if(minval>inbuf[cnt]){
minval = inbuf[cnt];
minid = cnt;
}
}
inbuf[minid] = 1000;//消除此项
return minval;
}
static int* min_array(struct alog my_alog, int* inbuf, int len, int num)
{
int cnt;
int* outbuf = malloc(num*sizeof(int));//存放在堆里,函数结束,空间不会自动被释放
for(cnt = 0;cnt<num;cnt++){
outbuf[cnt] = my_alog.find_min(inbuf,len);
}
return outbuf;
}
alog_find_minarray my_alog = {
.find_min = find_min,
.min_array = min_array,
};
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
// write code here
*returnSize = k;
return my_alog.min_array(my_alog,input,inputLen,k);
}