给你两个整数数组 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
分类讨论:
class Solution {
public long minOperations(int[] nums1, int[] nums2, int k) {
int n = nums1.length;
int sum = 0;
int dis[] = new int[n];
long result = 0;
if(k == 0){
for(int i = 0;i < n;i++){
if(nums1[i] != nums2[i]){
return -1;
}
}
return 0;
}
for(int i = 0;i < n;i++){
dis[i] = nums1[i] - nums2[i];
if((Math.abs(dis[i]) < k && Math.abs(dis[i]) != 0) || dis[i] % k != 0){
return -1;
}
sum += dis[i];
if(dis[i] > 0){
result += dis[i]/k;
}
}
if(sum != 0){
return -1;
}
return result;
}
}
首先检查k是否为0。如果k为0,则遍历nums1和nums2,如果它们在相同位置上的元素不相等,则返回-1。否则,返回0。
接下来,用整数数组dis,用于存储nums1和nums2之间的差值。然后遍历nums1和nums2,计算它们在相同位置上的差值,并将其存储在dis数组中。同时,检查差值是否满足以下条件之一:(1) 差值的绝对值小于k且不为0;(2) 差值除以k的余数不为0。如果满足这些条件之一,说明不可能相等,返回-1。
接着,因为一加一减算一次操作,所以统计差值为正或负的一次即可。
最后,如果sum不等于0,则返回-1;否则,返回result。