顺序表第十四题(求解三元组最短距离)

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;

}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值