本文主要是介绍每日一题:使数组中所有元素相等的最小操作数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
分类讨论:
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。
这篇关于每日一题:使数组中所有元素相等的最小操作数II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!