2541-使数组中所有元素相等的最小操作数 II

Raphael Liu Lv10

给你两个整数数组 nums1nums2 ,两个数组长度都是 n ,再给你一个整数 k 。你可以对数组 nums1 进行以下操作:

  • 选择两个下标 ij ,将 nums1[i] 增加 k ,将 nums1[j] 减少 k 。换言之,nums1[i] = nums1[i] + knums1[j] = nums1[j] - k

如果对于所有满足 0 <= i < n 都有 num1[i] == nums2[i] ,那么我们称 nums1 等于 nums2

请你返回使 _ _nums1 __ 等于 _ _nums2最少 操作数。如果没办法让它们相等,请你返回 -1

示例 1:

**输入:** nums1 = [4,3,1,4], nums2 = [1,3,7,1], k = 3
**输出:** 2
**解释:** 我们可以通过 2 个操作将 nums1 变成 nums2 。
第 1 个操作:i = 2 ,j = 0 。操作后得到 nums1 = [1,3,4,4] 。
第 2 个操作:i = 2 ,j = 3 。操作后得到 nums1 = [1,3,7,1] 。
无法用更少操作使两个数组相等。

示例 2:

**输入:** nums1 = [3,8,5,2], nums2 = [2,4,1,6], k = 1
**输出:** -1
**解释:** 无法使两个数组相等。

提示:

  • n == nums1.length == nums2.length
  • 2 <= n <= 105
  • 0 <= nums1[i], nums2[j] <= 109
  • 0 <= k <= 105

令 a[i] = \textit{nums}_1[i] - \textit{nums}_2[i],则问题变成把每个 a[i] 变成 0 的最小操作次数。

那么在 k=0 的时候,无法操作,那么所有 a[i] 必须为 0。

对于 k>0,由于每个 a[i] 要变成 0,它必须是 k 的倍数,如果 a[i]\bmod k \ne 0,就无法满足要求。

此外,由于「一个数 +k,另一个数 -k」这个操作不会影响整个 a[i] 的和,所以如果 a[i] 的和不为 0,也无法满足要求。

最后,统计所有正数 \dfrac{a[i]}{k,即为答案(因为负数都同时改成 0 了)。

附:视频讲解

[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def minOperations(self, nums1: List[int], nums2: List[int], k: int) -> int:
ans = sum = 0
for x, y in zip(nums1, nums2):
x -= y
if k:
if x % k: return -1
sum += x // k
if x > 0: ans += x // k
elif x: return -1
return -1 if sum else ans
[sol1-Go]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func minOperations(nums1, nums2 []int, k int) (ans int64) {
sum := 0
for i, x := range nums1 {
x -= nums2[i]
if k > 0 {
if x%k != 0 {
return -1
}
sum += x / k
if x > 0 {
ans += int64(x / k)
}
} else if x != 0 {
return -1
}
}
if sum != 0 {
return -1
}
return
}

复杂度分析

  • 时间复杂度:O(n),其中 n 为 nums}_1 的长度。
  • 空间复杂度:O(1),仅用到若干额外变量。
 Comments
On this page
2541-使数组中所有元素相等的最小操作数 II