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

📅  最后修改于: 2023-12-03 14:55:29.691000             🧑  作者: Mango

来自三个数组的三元组中对的绝对差的最小总和

介绍

给定三个长度为 n 的整数数组 nums1、nums2 和 nums3,请你找出满足以下条件的三元组 (i, j, k) :

  • 0 <= i, j, k < n
  • |nums1[i] - nums2[j]| <= d
  • |nums2[j] - nums3[k]| <= d
  • |nums1[i] - nums3[k]| <= d

其中 |x| 表示 x 的绝对值。

找出满足所有条件的三元组(i, j, k) 中对的绝对差的最小值,并返回这个最小值。

思路

对于此类题目,我们需要将其进行分解。

这道题目对于三元组中对的绝对值的最小和需要我们判断每一个数对的绝对差,那么我们考虑怎么处理绝对值符号。

考虑将各数组相减得到三个二维数组(nums1 与 nums2,nums2 与 nums3,nums1 与 nums3)。

我们可以发现,我们可以筛选每一个二维数组中的所有正数或者负数,然后在每一个数组中维护一个尺取值,可以让我们快速的找到满足题目给定条件的数,将其记录在答案数组中,最终计算答案即可。

代码
class Solution:
    def mini(self, a, b, c):
        a_len = len(a)
        b_len = len(b)
        c_len = len(c)
        i = j = k = 0
        ans = float("inf")
        while i < a_len and j < b_len and k < c_len:
            num_i = a[i]
            num_j = b[j]
            num_k = c[k]
            maximum = max(num_i, num_j, num_k)
            minimum = min(num_i, num_j, num_k)
            ans = min(ans, maximum - minimum)
            if num_i == minimum:
                i += 1
            elif num_j == minimum:
                j += 1
            else:
                k += 1
        return ans
    
    def minDifference(self, nums1: List[int], nums2: List[int], nums3: List[int]) -> int:
        nums1.sort()
        nums2.sort()
        nums3.sort()
        ans = float("inf")
        ans = min(ans, self.mini(nums1, nums2, nums3))
        ans = min(ans, self.mini(nums1, nums3, nums2))
        ans = min(ans, self.mini(nums2, nums1, nums3))
        ans = min(ans, self.mini(nums2, nums3, nums1))
        ans = min(ans, self.mini(nums3, nums1, nums2))
        ans = min(ans, self.mini(nums3, nums2, nums1))
        return ans
复杂度分析

该算法的时间复杂度为 $O(nlogn)$,空间复杂度为 $O(1)$。