文章

125

粉丝

0

获赞

1

访问

19.2k

头像
2020年计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年8月24日 21:21
阅读数 50

int solution(int*S1,int*S2,int*S3,int N1,int N2,int N3,)
{
	int i=N1-1,j=N2-1,k=N3-1,min,d,s;
	int *B1 = (int*)malloc(sizeof(int*N2)/sizeof(int));
	int *B2 = (int*)malloc(sizeof(int*N2)/sizeof(int));
	int *B3 = (int*)malloc(sizeof(int*N2)/sizeof(int));
	for(j=N2-1;j>=0;j--){
		while(i>0&&abs(S2[j]-S1[i-1])<abs(S2[j]-S1[i])){
			i--;
		}
		while(k>0&&abs(S2[j]-S3[k-1])<abs(S2[j]-S3[k])){
			k--;
		}
		B1[j]=abs(S2[j]-S1[i])+abs(S2[j]-S3[k]);
		B2[j]=i;
		B3[j]=k;
	}
	int min=B1[0]+S1[B2[0]]+S3[B3[0]];
	for(s=0;s<N2;s++){
		d = B1[s]+S1[B2[s]]+S3[B3[s]];
		if(d<min){
			min=d;
		}
	}
	return min;
}

(1)设计三个指针指向三个数组中的元素,维护S2的指针j,找到使|S2(j)-S1(i)|最小且最小的i和k,用三个辅助数组记录最小局部距离及对应的S1、S3下标,最后遍历辅助数组,考虑S1和S3间对应元素的部分距离和B1得到的S1和S2的部分距离,求和遍历可找到最小距离D

(3)时间复杂度O(N1+N2+N3),空间复杂度O(N2)


评分及理由

(1)得分及理由(满分3分)

学生给出的基本设计思想是:对于S2中的每个元素,寻找S1和S3中与其距离最近的元素(即最小化|S2[j]-S1[i]|和|S2[j]-S3[k]|),并记录局部距离和对应的下标,最后通过遍历辅助数组计算总距离并找到最小值。这种思路与标准答案中的同向多指针方法不同,...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发