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

146 阅读2分钟

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

解题思路详解

这个问题涉及到两个数组 a 和 b,目标是将这两个数组中的元素进行匹配,使得匹配后的元素对之间的差值绝对值之和最小。为了解决这个问题,我们可以采取以下步骤:

  1. 排序数组

    • 首先,对数组 a 和 b 进行排序。排序的目的是为了使得在后续步骤中,能够更容易地找到最佳匹配对。排序的复杂度为 O(nlogn),其中 n 是数组的长度。
  2. 匹配元素

    • 排序完成后,我们可以使用贪心算法的思想来进行匹配。具体来说,我们可以尝试将排序后的 a 和 b 中的元素一一对应,即 a[i] 与 b[i] 配对,这样可以确保差值最小的元素对在尽可能靠前的位置被匹配。
    • 这种方法之所以有效,是因为排序后,相邻元素之间的差值是最小的(相对未排序前),因此通过一一对应的方式匹配,可以使得整体差值绝对值之和最小化。
  3. 计算差值绝对值之和

    • 遍历排序后的数组 a 和 b,计算每个匹配对 a[i] 和 b[i] 的差值绝对值,并将这些差值累加。这个步骤的复杂度是 O(n),因为只需要一次遍历即可。

`

def solution(a: list, b: list) -> int:
    # 1. 对数组 a 和 b 进行排序
    a.sort()
    b.sort()

    # 2. 初始化差值之和
    total_diff = 0

    # 3. 遍历排序后的数组 a 和 b,计算差值绝对值之和
    for i in range(len(a)):
        total_diff += abs(a[i] - b[i])

    # 4. 返回差值之和
    return total_diff

if __name__ == '__main__':
    print(solution([2, 1, 3, 2], [5, 2, 4, 2]) == 5)
    print(solution([1, 4, 6], [2, 5, 7]) == 3)
    print(solution([1, 9, 6], [2, 5, 7]) == 4)

`

关键步骤

  • 排序:使用 sort() 方法对数组 a 和 b 进行排序。
  • 计算差值:使用 abs() 函数计算每个 a[i] 和 b[i] 的差值绝对值,并累加到 total_diff 中。