📌  相关文章
📜  具有最小绝对差和的数组元素 | 2套(1)

📅  最后修改于: 2023-12-03 15:22:35.364000             🧑  作者: Mango

具有最小绝对差和的数组元素

题目描述

给定两个长度相等的整数数组 arr1 和 arr2,求它们对应元素之差的绝对值的和的最小值。

即,求 $\sum\limits_{i=1}^{n} |arr1_i - arr2_i|$ 的最小值。

解法1:排序+双指针

思路:

  1. 将两个数组排序,假设中间点为mid。
  2. 对于arr1[i],在arr2中找到最接近它的数,可以使用双指针。
  3. 计算二者的差,将其绝对值加入答案,i++或j++,继续比较。
  4. 返回答案。

时间复杂度:$O(nlogn)$

实现:

def getMinAbsDiffSum(arr1: List[int], arr2: List[int]) -> int:
    arr1.sort()
    arr2.sort()

    left, right = 0, len(arr2) - 1
    res = 0
    for num in arr1:
        while left < len(arr2) - 1 and arr2[left] <= num:
            left += 1
        while right > 0 and arr2[right] >= num:
            right -= 1
        res += min(abs(num - arr2[left]), abs(num - arr2[right]))

    return res
解法2:动态规划

思路:

  1. 定义二维数组dp[i][j],表示arr1的前i个数和arr2的前j个数之间的最小差值和。
  2. 初始状态为dp[0][0] = 0。
  3. 推导状态转移方程,dp[i][j]只能由以下三种状态转移而来:
    • dp[i-1][j] + |arr1[i] - arr2[j]|
    • dp[i][j-1] + |arr1[i] - arr2[j]|
    • dp[i-1][j-1] + |arr1[i] - arr2[j]|
  4. 返回dp[-1][-1],即表示arr1和arr2之间的最小差值和。

时间复杂度:$O(n^2)$

实现:

def getMinAbsDiffSum(arr1: List[int], arr2: List[int]) -> int:
    m, n = len(arr1), len(arr2)
    dp = [[0] * (n+1) for _ in range(m+1)]

    for i in range(1, m+1):
        dp[i][0] = dp[i-1][0] + abs(arr1[i-1] - arr2[0])

    for j in range(1, n+1):
        dp[0][j] = dp[0][j-1] + abs(arr1[0] - arr2[j-1])

    for i in range(1, m+1):
        for j in range(1, n+1):
            dp[i][j] = min(dp[i-1][j] + abs(arr1[i-1] - arr2[j-1]),
                           dp[i][j-1] + abs(arr1[i-1] - arr2[j-1]),
                           dp[i-1][j-1] + abs(arr1[i-1] - arr2[j-1]))

    return dp[-1][-1]

以上就是本题的两种解法,两种解法各有优缺点,需要根据具体情况选择合适的算法。