首页 > 试题广场 >

最接近的K个元素

[编程题]最接近的K个元素
  • 热度指数:557 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的升序数组 nums 和两个整数 k 和 x ,从数组中找到最接近 x (两数之差最小)的 k 个数并升序得输出他们。

整数 a 比整数 b 更接近 x 需要满足
|a-x| < |b-x| ,
|a-x| = |b-x| 时 a < b

数据范围:
示例1

输入

[1,2,3,4,5],4,4

输出

[2,3,4,5]
示例2

输入

[1,2,3,4,5],4,3

输出

[1,2,3,4]
示例3

输入

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


发表于 2023-03-16 19:55:09 回复(0)

问题信息

难度:
3条回答 1805浏览

热门推荐

通过挑战的用户

查看代码