📅  最后修改于: 2023-12-03 15:26:10.802000             🧑  作者: Mango
给定一个包含 n 个整数的数组 a,设计一个算法,计算出数组中由不同三元组 (i, j, k) 组成的三元组对 (i', j', k') 之间的绝对差 $|a_i-a_j|+|a_j-a_k|+|a_i-a_k|$ 的最大总和。
首先,我们可以将绝对值符号拆掉,将 $|a_i-a_j|+|a_j-a_k|+|a_i-a_k|$ 转化为以下三种情况的加和:
那么,可以对数组 a 进行排序,从小到大枚举中间元素 j,在左侧和右侧分别用两个指针 i 和 k 扫描,统计出 $a_i\leq a_j\leq a_k$、$a_j\leq a_i\leq a_k$、$a_j\leq a_k\leq a_i$ 这三种情况下的最大贡献即可,其中最大贡献等于上述公式的值。
假设数组 a 的长度为 n,则排序需要 O(nlog(n)) 的时间,枚举中间元素 j 需要 O(n) 的时间,左右指针 i 和 k 分别扫描需要 O(n) 的时间,因此总时间复杂度为 O(nlog(n)+n^2) = O(n^2)。
def max_sum_of_diff_triples(a: List[int]) -> int:
a.sort()
n = len(a)
res = 0
for j in range(1, n - 1):
i, k = 0, n - 1
while i < j and j < k:
res = max(res, 2 * (a[j] - a[i]) + 2 * (a[k] - a[j]))
if a[j] - a[i] > a[k] - a[j]:
k -= 1
else:
i += 1
return res
输入:
a = [1,2,4,6,8]
输出:
16
解释:
其中的三元组对包括:
共计 6 个不同的三元组对,对应的绝对差之和的最大总和为 16。