📌  相关文章
📜  来自三个数组的三元组中对的绝对差的最小总和(1)

📅  最后修改于: 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