三元组最小距离
題目描述
已知三個升序整數數組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 bmins = mins if mins < c else creturn minsdef maxs(a,b,c):maxs = b if a < b else amaxs = c if maxs < c else maxsreturn maxsdef minDistance(a,b,c):aLen = len(a)bLen = len(b)cLen = len(c)curDist = 0minsd = 0minDist = 2 ** 32i = 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 += 1if i >= aLen:breakelif minsd == b[j]:j += 1if j >= bLen:breakelse:k += 1if k >= cLen:breakreturn minDistif __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)))
?
總結
- 上一篇: 人工智能与模式识别的意义(模式识别与图像
- 下一篇: 【数据分析】如何在企业中从0-1建立一个