三元组最小距离

已知三个升序整数数组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]|)请设计一个求最小三元组距离的最优算法,并分析时间复杂度。


关键公式:max(|a[i]–b[j]|,|a[i]–c[k]|,|b[j]–c[k]|) = (abs(a[i]-b[j])+abs(a[i]-c[k])+abs(b[j]-c[k]))/2

首先想到的是暴力法,三层循环,时间复杂度为O(l*m*n)

另一种思路,开始得出三个数组第一个元素的最小距离,接下来移动最小三个元素中最小元素的下标,与之前得到的最小距离比较,看是否需要更新最小距离,直到遍历完三个数组,时间复杂度为O(l+m+n)

基于第二种思路的代码:

int minDistance(int a[], int l, int b[], int m, int c[], int n)
{
	int i = 0, j = 0, k = 0;
	int sum = 0;
	int min = 0;
	int minDis = (abs(a[i]-b[j])+abs(a[i]-c[k])+abs(b[j]-c[k]))/2;
	
	for (int cnt = 0; cnt <= (l + m + n); cnt++)
	{
		sum = (abs(a[i]-b[j])+abs(a[i]-c[k])+abs(b[j]-c[k]))/2;
		minDis = sum < minDis ? sum : minDis;
		
		min = myMin(a[i], b[j], c[k]);
		if (min == a[i])
		{
			if (++i > l)
				break;
		}
		if (min == b[j])
		{
			if (++j > m)
				break;
		}
		if (min == c[k])
		{
			if (++k > n)
				break;
		}
	}
	
	return minDis;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值