题目描述
已知三个升序整数数组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 ]|)
请设计一个求最小三元组距离的最优算法,并分析时间复杂度。
解题思路
保持三个下标索引 i,j,k,找出a[i],b[j],c[k]里最小的元素。如果a[i]最小, 则下一次循环 i=i+1, 其他两个索引不变。如果b[j]最小, 则下一次循环 j=j+1, 其他两个索引不变。如果c[k]最小, 则下一次循环 k=k+1, 其他两个索引不变。如此循环,直至最小的数对应的下标到达该数组尾部。记录最小距离。
时间复杂度:O(l+m+m) (每次循环总有一个下标走了一步)。
代码实现
#方法二
def mins(a,b,c):
mins = a if a < b else b
mins = mins if mins < c else c
return mins
def maxs(a,b,c):
maxs = b if a < b else a
maxs = c if maxs < c else maxs
return maxs
def minDistance(a,b,c):
aLen = len(a)
bLen = len(b)
cLen = len(c)
curDist = 0
minsd = 0
minDist = 2 ** 32
i = 0 #数组a的下标
j = 0 #数组b的下标
k = 0 #数组c的下标
while True:
curDist = maxs(abs(a[i]-b[j]),abs(a[i]-c[k]),abs(b[j]-c[k]))
if curDist < minDist:
minDist = curDist
#找出当前遍历到三个数组中最小值
minsd = mins(a[i],b[j],c[k])
if minsd == a[i]:
i += 1
if i >= aLen:
break
elif minsd == b[j]:
j += 1
if j >= bLen:
break
else:
k += 1
if k >= cLen:
break
return minDist
if __name__ == "__main__":
a = [3,4,5,7,15]
b = [10,12,14,16,17]
c = [20,21,23,24,37,30]
print("最小距离为:"+str(minDistance(a,b,c)))