题目简介:
给你两个长度可能不等的整数数组 nums1
和 nums2
。两个数组中的所有值都在 1
到 6
之间(包含 1
和 6
)。
每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1
到 6
之间 任意 的值(包含 1
和 6
)。
请你返回使 nums1
中所有数的和与 nums2
中所有数的和相等的最少操作次数。如果无法使两个数组的和相等,请返回 -1
。
示例 1:
1 | 输入:nums1 = [1,2,3,4,5,6], nums2 = [1,1,2,2,2,2] |
示例 2:
1 | 输入:nums1 = [1,1,1,1,1,1,1], nums2 = [6] |
提示:
1 <= nums1.length, nums2.length <= 10^5
1 <= nums1[i], nums2[i] <= 6
思路:
首先我们判断两个数组,哪个数组总和大。(若总和一样,返回0
即可)
然后,我们需要将数组总和大的数组元素变小,将总和小的数组元素变大,以至于两个数组总和能相等。
因此,设定一个数组count
,来记录每个元素能变小(变成1)或变大(变成6)的差值。
然后,我们利用贪心,每次减去差值最大的元素,观察diff
是否可以<= 0
。
- 若
diff > count[i] * i
,则更新diff = diff - count[i] * i
。 - 否则,我们只需要变化
ceil(diff * 1.0 / i)
数量的元素即可。
代码如下:
1 | class Solution { |