题目
来源:【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;
}
有空再来更其他解法