问题描述
小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]))。我们需要找到一种排列方式,使得对应的元素差值的绝对值和最小。
思路分析:
-
目标:我们要最小化所有元素差值的绝对值之和
sum(abs(a[i] - b[i]))。为了做到这一点,理想情况下,我们希望a[i]和b[i]的值尽可能接近。 -
贪心策略:可以考虑将
a和b都按照升序排序。因为如果两个数组的元素差异较小,它们的差值绝对值就会较小。- 排序后,
a[i]会和b[i]对应元素最为接近,从而减少差异。 - 如果先排序后再一一对应,那么每一对元素差的绝对值最小,整体差异也就最小。
- 排序后,
-
理由:
- 如果你把
a和b分别排序后,最小的元素会与最小的元素匹配,次小的元素与次小的元素匹配,这样大多数情况下会减少不必要的差异。换句话说,两个相近的数会减少它们之间的差距。
- 如果你把
解决方案:
- 对数组
a和b分别进行排序。 - 计算排序后
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
解释:
a.sort()和b.sort()分别将数组a和b排序,使得数组中的元素按从小到大的顺序排列。- 遍历数组
a和b,计算每一对对应元素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] 之间的差值的绝对值之和最小。解决思路是使用 贪心策略:将两个数组分别排序,然后逐个对比排序后的元素对。排序后的元素差异通常较小,因此这种排列方式可以有效减少总差异。
具体做法是:
- 对
a和b分别进行升序排序。 - 计算排序后的数组对应元素之间的差值绝对值之和。
通过这种方式,较小的数会和较小的数匹配,较大的数会和较大的数匹配,从而最小化了整体差异。算法的时间复杂度为 O(n log n),主要由排序操作决定,因此能在大多数情况下高效运行。
例如,对于输入 [2, 1, 3, 2] 和 [5, 2, 4, 2],排序后得到 [1, 2, 2, 3] 和 [2, 2, 4, 5],计算差值和为 5,这是最小的差异。