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

83 阅读3分钟

问题描述

小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

思路分析

1.问题理解

小C 和小U 有两个数组 a 和 b,它们的长度相同。小U 希望通过重新排列数组 a 的元素,来最小化 a 和 b 之间的差异。具体来说,他们要最小化所有元素差值绝对值之和,即 sum(abs(a[i] - b[i]))

2.数据结构选择

由于我们需要对数组 a 进行重新排列,并且需要计算差值绝对值之和,因此选择数组作为主要的数据结构是合适的。

3.算法步骤

  1. 排序:首先对数组 a 进行排序。排序的目的是使得 a 中的元素与 b 中的元素尽可能接近,从而最小化差值绝对值之和。
  2. 匹配:将排序后的 a 与 b 进行匹配,使得每个 a[i] 与 b[i] 的差值绝对值之和最小。
  3. 计算差值:遍历排序后的 a 和 b,计算每个位置的差值绝对值,并累加得到总和。

4.详细步骤

  1. 排序

    • 对数组 a 进行排序。
    • 对数组 b 进行排序(虽然 b 不需要重新排列,但为了保持一致性,也可以对 b 进行排序)。
  2. 匹配

    • 由于 a 和 b 都已经排序,直接按顺序匹配即可。
  3. 计算差值

    • 初始化一个变量 total_sum 用于存储差值绝对值之和。
    • 遍历数组 a 和 b,计算每个位置的差值绝对值,并累加到 total_sum 中。

复杂度分析

  • 时间复杂度:排序的时间复杂度为 O(n log n),遍历数组的时间复杂度为 O(n)。因此,总的时间复杂度为 O(n log n)
  • 空间复杂度:除了输入数组外,算法没有使用额外的空间,因此空间复杂度为 O(1)

详细代码

微信图片_20241130210334.png

代码解释

函数定义

def solution(a: list, b: list) -> int:

  • solution 函数接受两个参数 a 和 b,它们都是列表类型。
  • 函数返回一个整数,表示数组 a 和 b 之间的最小差值绝对值之和。

初始化总和

sum = 0

  • sum 用于存储差值绝对值之和,初始值为 0。

排序

a.sort(),b.sort()

计算差值绝对值之和

for i in range(0,len(a)): sum += abs(a[i] - b[i])

  • 使用 for 循环遍历数组 a 和 b
  • abs(a[i] - b[i]) 计算 a[i] 和 b[i] 之间的差值绝对值。
  • 将每个差值绝对值累加到 sum 中。

返回结果

return sum

  • 返回 sum,即数组 a 和 b 之间的最小差值绝对值之和。

思考与总结

这道题的代码通过排序和匹配,有效地最小化了两个数组 a 和 b 之间的差值绝对值之和。排序确保了 a 中的元素与 b 中的元素尽可能接近,从而在匹配时能够得到最小的差值。算法的时间复杂度为 O(n log n),主要由排序操作决定,而空间复杂度为 O(1),没有使用额外的空间。这种方法简单且高效,适用于大多数情况。通过这种策略,我们能够在不改变 b 的情况下,通过重新排列 a 来达到最优解。总体而言,排序和匹配是解决这类问题的关键步骤,能够显著提高算法的效率和准确性。