📅  最后修改于: 2023-12-03 15:26:34.438000             🧑  作者: Mango
给定三个长度分别为 $n$ 的数组 $a$、$b$ 和 $c$。选出三元组 $(i, j, k)$ 满足 $1 \leq i, j, k \leq n$,定义:
$$ \begin{aligned} A &= |a_i - b_j|, \ B &= |a_i - c_k|, \ C &= |b_j - c_k|. \end{aligned} $$
求 $A + B + C$ 的最小值。
根据绝对值的性质,如果 $a \leq b \leq c$,那么 $a$ 一定是由 $b$ 或 $c$ 减去得到,或者 $b$ 是由 $c$ 减去得到。因此我们可以假设 $a_i \leq b_j \leq c_k$,然后只需要枚举 $i, j, k$ 即可。
我们可以对 $b$ 和 $c$ 进行升序排序,然后对于每个 $a_i$,找到 $b_j$ 和 $c_k$ 使得它们分别大于等于 $a_i$,然后计算 $A + B + C$ 的值并保留最小值。
时间复杂度为 $\mathcal{O}(n\log n)$。
def solve(a, b, c):
a.sort()
b.sort()
c.sort()
ans = float('inf')
i, j, k = 0, 0, 0
while i < len(a) and j < len(b) and k < len(c):
ans = min(ans, abs(a[i] - b[j]) + abs(a[i] - c[k]) + abs(b[j] - c[k]))
if a[i] <= b[j] and a[i] <= c[k]:
i += 1
elif b[j] <= a[i] and b[j] <= c[k]:
j += 1
else:
k += 1
return ans
assert solve([1, 2, 3], [4, 5, 6], [7, 8, 9]) == 0
assert solve([0, 0, 0], [0, 0, 0], [0, 0, 0]) == 0
assert solve([1, 2, 3], [1, 2, 3], [1, 2, 3]) == 2