【算法】三元组求最小距离

题目

来源:【2020-408统考真题】【leetcode】【阿里面试题】

定义三元组(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)。

解答

【方法】 暴力破解
【上手程度】 易 (适合初学者、非科班及备考时间有限的朋友)
【语言】 C++
【时间复杂度】 O(n^3)
【思路】 首先,解决三元组的分组问题,三层for循环直接出结果。接着,进行计算,要注意处理绝对值问题,得到的结果进行比较,出现比记录的数据还小的值,则将当前值赋值给记录min。

还需要注意的一点是,题目中集合长度不是固定值,所以需要自己获取一下长度,sizeof(S1)/sizeof(S1[0])是比较万能的办法,C/C++都可以用。

#include <stdio.h>
int main()
{
	//三元组
    int S1[3] = {1,12,13};
    int S2[3] = {2,22,23};
    int S3[3] = {3,32,33};
    
	int min=0;//记录最小三元组距离
	int aa,bb,cc;//记录最小三元组
	//三层for循环嵌套
	//sizeof(S1)/sizeof(S1[0])获取数组集合的长度
	for(int i=0;i<sizeof(S1)/sizeof(S1[0]);i++){
		for(int j=0;j<sizeof(S2)/sizeof(S2[0]);j++){
			for(int k=0;k<sizeof(S3)/sizeof(S3[0]);k++){
				int d=0,add=0; //d用于记录距离,add记录每次要加的数值
				add=S1[i]-S2[j];//计算数值
				if(add<0){d=d-add;}else{d=d+add;}//处理绝对值
				add=S2[j]-S3[k];
				if(add<0){d=d-add;}else{d=d+add;}
				add=S3[k]-S1[i];
				if(add<0){d=d-add;}else{d=d+add;}
				printf("%d %d %d =%d\n",S1[i],S2[j],S3[k],d); //输出三元组以及距离
				if(min==0||min>d){min=d;aa=S1[i];bb=S2[j];cc=S3[k];}//如果出现更小的距离,进行替换
			}
		}	
	}
	printf("%d %d %d =%d\n",aa,bb,cc,min);//输出结果
    return 0;
}

有空再来更其他解法

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值