求解最小三元组距离

14 篇文章 0 订阅

已知三个升序整数数组a[l], b[m]和c[n]。请在三个数组中各找一个元素,是的组成的三元组距离最小。三元组的距离定义是:假设a[i]、b[j]和c[k]是一个三元组,那么距离为:

Distance = max(|a[ I ] – b[ j ]|, |a[ I ] – c[ k ]|, |b[ j ] – c[ k ]|)

请设计一个求最小三元组距离的最优算法,并分析时间复杂度。

思路:

1.蛮力法,三个循环分别遍历三个数组,比较任意三个数的距离。这样做时间复杂度o(l*m*n),显然不是最优解

2这里写图片描述

每次都是移动较小的数组的下表。直到一个数组遍历完毕。

代码:

//求最小三元组的距离
public class MinDistance {

	public static int min(int a,int b,int c){
		return c>(a>b?b:a)?(a>b?b:a):c;
	}
	public static int max(int a,int b,int c){
		return c<(a>b?a:b)?(a>b?a:b):c;
	}
	public static int minDiatence(int[] a,int[] b,int[] c){
		
		
		int i = 0;//a数组下表
		int j = 0;//b数组下表
		int k = 0;//c数组小表
		int minDis = Integer.MAX_VALUE;
		int curDis = 0;
		int aLen = a.length;
		int bLen = b.length;
		int cLen = c.length;
		int min = 0;
		while(i<aLen&&j<bLen&&k<cLen){
			curDis = max(Math.abs(a[i]-b[j]),Math.abs(a[i]-c[k]),Math.abs(b[j]-c[k]));
			if(curDis<minDis)
				minDis = curDis;
			min = min(a[i],b[j],c[k]);
			if(min==a[i]){
				i++;
			}else if(min==b[j]){
				j++;
			}else{
				k++;
			}
		}
		return minDis;
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int[] a={3,4,5,7};
		int[] b={10,12,14,16,17};
		int[] c={20,21,23,24,37,30};
		System.out.println(minDiatence(a,b,c));
	}

}

时间复杂度:O(l+m+n) (每次循环总有一个下标走了一步)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值