给定一个长度为 n 的升序数组 nums 和两个整数 k 和 x ,从数组中找到最接近 x (两数之差最小)的 k 个数并升序得输出他们。
整数 a 比整数 b 更接近 x 需要满足
|a-x| < |b-x| ,
|a-x| = |b-x| 时 a < b
数据范围: ,
[1,2,3,4,5],4,4
[2,3,4,5]
[1,2,3,4,5],4,3
[1,2,3,4]
[1,2,3,4],4,0
[1,2,3,4]
struct node{ int val;//绝对值 int index;//对应原数组中的下标 }; int cmp1(const void* a,const void* b){ struct node* x=(struct node*)a; struct node* y=(struct node*)b; return x->val-y->val; } int cmp2(const void* a,const void* b){ struct node* x=(struct node*)a; struct node* y=(struct node*)b; return x->index-y->index; } int* closestElement(int* nums, int numsLen, int k, int x, int* returnSize ) { *returnSize=k; int* res=(int*)malloc(sizeof(int)*k); struct node* arr=(struct node*)malloc(sizeof(struct node)*numsLen); for(int i=0;i<numsLen;i++){ arr[i].val=abs(nums[i]-x);//辅助数组记录差值的绝对值 arr[i].index=i;//记录下标 } qsort(arr,numsLen,sizeof(struct node),cmp1);//先比较差值 qsort(arr,k,sizeof(struct node),cmp2);//再比较下标,排序 for(int j=0;j<k;j++){ res[j]=nums[arr[j].index]; } return res; }