原题如下
小C 和小U 有两个数组,分别是 a 和 b,它们的长度相同。小U 想通过重新排列数组 a 的元素,来最小化 a 和 b 之间的差异。具体来说,他们要最小化所有元素差值绝对值之和,即 sum(abs(a[i] - b[i]))。
你能帮助小C 和小U 找到这个最小化的值吗?
解题思路详解
这个问题涉及到两个数组 a 和 b,目标是将这两个数组中的元素进行匹配,使得匹配后的元素对之间的差值绝对值之和最小。为了解决这个问题,我们可以采取以下步骤:
-
排序数组:
- 首先,对数组 a 和 b 进行排序。排序的目的是为了使得在后续步骤中,能够更容易地找到最佳匹配对。排序的复杂度为 O(nlogn),其中 n 是数组的长度。
-
匹配元素:
- 排序完成后,我们可以使用贪心算法的思想来进行匹配。具体来说,我们可以尝试将排序后的 a 和 b 中的元素一一对应,即 a[i] 与 b[i] 配对,这样可以确保差值最小的元素对在尽可能靠前的位置被匹配。
- 这种方法之所以有效,是因为排序后,相邻元素之间的差值是最小的(相对未排序前),因此通过一一对应的方式匹配,可以使得整体差值绝对值之和最小化。
-
计算差值绝对值之和:
- 遍历排序后的数组 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中。