文章
125
粉丝
0
获赞
1
访问
19.2k
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]|),并记录局部距离和对应的下标,最后通过遍历辅助数组计算总距离并找到最小值。这种思路与标准答案中的同向多指针方法不同,...
登录后发布评论
暂无评论,来抢沙发