14.定义三元组(a,b,c)(a、b、c均为正数)的距离D=∣a-b∣+∣b-c∣+∣c-a∣。
给定3个非空整数集合S1、S2和S3,按升序分别存储在3个数组中。
请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c)
(a∈S1,b∈S2,c∈S3)中的最小距离。
例如S1={-1,0,9},S2={-25,-10,10,11},S3={2,9,17,30,41},
则最小距离为2,相应的三元组为(9,10,9)。要求:
1)给出算法的基本设计思想。
2)根据设计思想,采用C语言或C++语言描述算法,关键之处给出注释。
3)说明你所设计算法的时间复杂度和空间复杂度。
代码:
/*已知三个升序整数数组a[1],b[m]和c[n]。
请在三个数组中各找一个元素,使得组成的三元组距离最小。
三元组的距离定义是:假设a[i],b[j],c[k]是一个三元组,那么距离为:
distance=max(∣a[i]-b[j]∣,∣a[i]-c[k]∣,∣b[j]-c[k]∣)
请设计一个最小三元组距离的最优算法,并分析时间复杂度。
*/
#include<stdio.h>
#include<math.h>
int dis(int a,int b,int c){//返回距离
return abs(a-b)+abs(b-c)+abs(a-c);
}
int min(int a,int b,int c){//返回当前最小值,此时便移动它的指针
if(a<b&&a<c)
return a;
else if(b<c&&b<a)
return b;
else
return c;
}
int findMinofTrip(int *s1, int *s2, int *s3,int len1,int len2,int len3){
int i=0,j=0,k=0;//数组下标,遍历数组
int Max=1000;//设定一个最大数组,假定为1000
int nowD=0;
while(i<len1&&j<len2&&k<len3){
nowD=dis(s1[i],s2[j],s3[k]);
if(nowD<Max) Max=nowD;//进行更新
if(s1[i]==min(s1[i],s2[j],s3[k])) i++;
else if(s2[j]==min(s1[i],s2[j],s3[k])) j++;
else k++;
}
return Max;
}
int main(){
int S1[]={-1,0,9};
int S2[]={-25,-10,10,11};
int S3[]={2,9,17,30,41};
int minD=findMinofTrip(S1,S2,S3,3,4,5);
return 0;
}