给你两个长度可能不等的整数数组 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] |
示例 3:
1 | 输入:nums1 = [6,6], nums2 = [1] |
二分~
容易想到二分次数,但是 check 函数比较难想,我们要先计算两个数组和的差值 res,如果次数为 x,试想,我们必须要用 x 次操作使得两个数组的和尽可能接近,一次操作变化的最大值有下面两种情况:
- 将数组和较大的数组 v1 按从大到小排序,变化的最大值即为 v1.front()-1
- 将数组和较大的数组 v2 按从小到大排序,变化的最大值即为 6-v2.front()
基于上述的分类,我们可以开两个指针 l1,l2 指向两个数组的开头,在二分的过程中判断是否能让 res=0 即可,AC 代码如下:
1 | class Solution { |