数组重排最小化差值 | 豆包MarsCode AI刷题

135 阅读4分钟

数组重排最小化差值 - MarsCode

问题描述

小C 和小U 有两个数组,分别是 a 和 b,它们的长度相同。小U 想通过重新排列数组 a 的元素,来最小化 a 和 b 之间的差异。具体来说,他们要最小化所有元素差值绝对值之和,即 sum(abs(a[i] - b[i]))。 你能帮助小C 和小U 找到这个最小化的值吗?


测试样例

样例1:

输入:a = [2, 1, 3, 2], b = [5, 2, 4, 2] 输出:5

样例2:

输入:a = [1, 4, 6], b = [2, 5, 7] 输出:3

样例3:

输入:a = [1, 9, 6], b = [2, 5, 7] 输出:4

这个问题的核心是通过重新排列数组 a 的元素,来最小化 sum(abs(a[i] - b[i]))。我们需要找到一种排列方式,使得对应的元素差值的绝对值和最小。

思路分析:

  1. 目标:我们要最小化所有元素差值的绝对值之和 sum(abs(a[i] - b[i]))。为了做到这一点,理想情况下,我们希望 a[i]b[i] 的值尽可能接近。

  2. 贪心策略:可以考虑将 ab 都按照升序排序。因为如果两个数组的元素差异较小,它们的差值绝对值就会较小。

    • 排序后,a[i] 会和 b[i] 对应元素最为接近,从而减少差异。
    • 如果先排序后再一一对应,那么每一对元素差的绝对值最小,整体差异也就最小。
  3. 理由

    • 如果你把 ab 分别排序后,最小的元素会与最小的元素匹配,次小的元素与次小的元素匹配,这样大多数情况下会减少不必要的差异。换句话说,两个相近的数会减少它们之间的差距。

解决方案:

  1. 对数组 ab 分别进行排序。
  2. 计算排序后 a[i]b[i] 之间的差异绝对值之和。
def min_difference(a, b):
    # 对两个数组进行排序
    a.sort()
    b.sort()
    
    # 计算差异的绝对值之和
    total_diff = 0
    for i in range(len(a)):
        total_diff += abs(a[i] - b[i])
    
    return total_diff

# 测试样例
print(min_difference([2, 1, 3, 2], [5, 2, 4, 2]))  # 输出: 5
print(min_difference([1, 4, 6], [2, 5, 7]))        # 输出: 3
print(min_difference([1, 9, 6], [2, 5, 7]))        # 输出: 4

解释:

  1. a.sort()b.sort() 分别将数组 ab 排序,使得数组中的元素按从小到大的顺序排列。
  2. 遍历数组 ab,计算每一对对应元素 a[i]b[i] 之间的差异的绝对值,并将所有差值相加。

时间复杂度:

  • 排序操作的时间复杂度是 O(n log n),其中 n 是数组的长度。
  • 计算差异的时间复杂度是 O(n),因为我们需要遍历一次数组。

因此,总的时间复杂度是 O(n log n)

测试:

  • 输入 [2, 1, 3, 2][5, 2, 4, 2],排序后得到 [1, 2, 2, 3][2, 2, 4, 5],对应元素差异绝对值之和是 |1-2| + |2-2| + |2-4| + |3-5| = 1 + 0 + 2 + 2 = 5,输出 5
  • 输入 [1, 4, 6][2, 5, 7],排序后得到 [1, 4, 6][2, 5, 7],对应元素差异绝对值之和是 |1-2| + |4-5| + |6-7| = 1 + 1 + 1 = 3,输出 3
  • 输入 [1, 9, 6][2, 5, 7],排序后得到 [1, 6, 9][2, 5, 7],对应元素差异绝对值之和是 |1-2| + |6-5| + |9-7| = 1 + 1 + 2 = 4,输出 4

这个问题的目标是通过重新排列数组 a,使得 a[i]b[i] 之间的差值的绝对值之和最小。解决思路是使用 贪心策略:将两个数组分别排序,然后逐个对比排序后的元素对。排序后的元素差异通常较小,因此这种排列方式可以有效减少总差异。

具体做法是:

  1. ab 分别进行升序排序。
  2. 计算排序后的数组对应元素之间的差值绝对值之和。

通过这种方式,较小的数会和较小的数匹配,较大的数会和较大的数匹配,从而最小化了整体差异。算法的时间复杂度为 O(n log n),主要由排序操作决定,因此能在大多数情况下高效运行。

例如,对于输入 [2, 1, 3, 2][5, 2, 4, 2],排序后得到 [1, 2, 2, 3][2, 2, 4, 5],计算差值和为 5,这是最小的差异。