鑒于3排序(非空)陣列A,B和C。有必要找到一個三元組A[i], B[j],C[k]其運算式(max(A[i], B[j], C[k]) - min(A[i], B[j], C[k]))將是所有可能的三元組中的最小值。如果有多個具有相同值的三元組,則列印最接近陣列開頭的一個(優先級A, B, C)。
我正在嘗試實作這個演算法問題,但是在第二個測驗用例中出現運行時錯誤。

A = []
x = int(input())
for i in range(0, x):
ele = int(input())
A.append(ele)
fnum = A[0]
B = []
y = int(input())
for i in range(0, y):
ele2 = int(input())
B.append(ele2)
C = []
z = int(input())
for i in range(0, z):
ele3 = int(input())
C.append(ele3)
def solve(A, B, C):
i = len(A) - 1
j = len(B) - 1
k = len(C) - 1
min_diff = abs(max(A[i], B[j], C[k]) -
min(A[i], B[j], C[k]))
while i != -1 and j != -1 and k != -1:
current_diff = abs(max(A[i], B[j],
C[k]) - min(A[i], B[j], C[k]))
if current_diff < min_diff:
min_diff = current_diff
max_term = max(A[i], B[j], C[k])
if A[i] == max_term:
i -= 1
elif B[j] == max_term:
j -= 1
else:
k -= 1
return min_diff
print("Numbers =", fnum, ele2, ele3)
print("Result =", solve(A, B, C))
uj5u.com熱心網友回復:
您可以使用乘積函式(來自 itertools)來“蠻力”組合分析,選擇最大值和最小值之間差異最小的三元組:
from itertools import product
def maxmin(A,B,C):
return min((max(p)-min(p),p) for p in product(A,B,C))
輸出:
A = [10, 11, 12, 13, 14]
B = [1, 2, 3, 4, 5]
C = [8]
print(*maxmin(A,B,C))
5 (10, 5, 8)
不使用庫的等效邏輯將需要 3 個嵌套回圈:
def maxmin(A,B,C):
n, abc = None, None
for a in A:
for b in B:
for c in C:
d = max(a,b,c)-min(a,b,c)
if not abc or d<n:
n, abc = d, (a,b,c)
return n, abc
盡管您可以將其放在理解中:
def maxmin(A,B,C):
return min(((max(a,b,c)-min(a,b,c),(a,b,c))
for a in A for b in B for c in C))
maxmin(A,B,C)
5 (10, 5, 8)
uj5u.com熱心網友回復:
輸入串列已排序,您可以通過迭代它們并使用最小元素推進串列上的索引(目的是增加其值)以線性時間求解,直到您沒有到達其中一個輸入的末尾串列。
例子:
def min_diff(l1, l2, l3):
best_min = float("inf")
best_tuple = None
i = j = k = 0
while i < len(l1) and j < len(l2) and k < len(l3):
curr_sol = l1[i], l2[j], l3[k]
curr_diff = max(curr_sol) - min(curr_sol)
curr_min = min(curr_sol)
if l1[i] == curr_min:
i = 1
elif l2[j] == curr_min:
j = 1
else:
k = 1
if curr_diff < best_min:
best_min = curr_diff
best_tuple = curr_sol
return best_tuple, best_min
>>> print(min_diff([10, 11, 12, 13, 14], [1, 2, 3, 4, 5], [8]))
((10, 5, 8), 5)
對于 10k 個元素的 3 個串列,每個所需的時間將是毫秒,而暴力方法需要幾分鐘。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420492.html
標籤:
上一篇:在python中接收JSON以將JSON值發送到類變數時出現KeyError
下一篇:熊貓每組列之間的計算
