2541-使数组中所有元素相等的最小操作数 II
给你两个整数数组 nums1
和 nums2
,两个数组长度都是 n
,再给你一个整数 k
。你可以对数组 nums1
进行以下操作:
- 选择两个下标
i
和j
,将nums1[i]
增加k
,将nums1[j]
减少k
。换言之,nums1[i] = nums1[i] + k
且nums1[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 了)。
附:视频讲解
1 | class Solution: |
1 | func minOperations(nums1, nums2 []int, k int) (ans int64) { |
复杂度分析
- 时间复杂度:O(n),其中 n 为 nums}_1 的长度。
- 空间复杂度:O(1),仅用到若干额外变量。
Comments