在Python中查找具有最小操作次数的相等和数组
假设我们有两个名为nums1和nums2的数组。 数组中的值介于1和6(包括1和6)之间。 在一次操作中,我们可以将任何数组中的任何值更新为介于1和6之间的任何值。 我们必须找到使nums1中的值的总和等于nums2中的值的总和所需的最小操作数。 如果不可能,则我们必须返回-1。
因此,如果输入是nums1 = [1,5,6],nums2 = [4,1,1],则输出将为2,因为我们可以将nums2从[4,1,1]更改为[4,1,6]在第一次操作中,然后在第二个操作中[4,2,6]以使其等于nums1。
要解决此问题,我们将按照以下步骤执行 –
- s1:nums1中所有元素的总和
-
s2:nums2中所有元素的总和
-
对列表nums1和列表nums2进行排序
-
如果s1>s2,则
- 交换nums1和nums2
-
交换s1和s2
-
ans:= 0
-
left:= 0,right:= nums2的大小-1
-
当left=0时执行以下操作
- 如果s1与s2相同,则
- 返回ans
- curr_left:= nums1左侧的元素(如果left
-
curr_right:= nums2右侧的元素(如果right>=0,则为0)
-
如果6-curr_left≥ curr_right-1,则
- s1:= s1 + 6-curr_left和s2-s1中的最小值
-
left:= left + 1
-
否则,
- s2:= s2- curr_right-1和s2-s1中的最小值
-
right:= right- 1
-
ans:= ans + 1
- 如果s1与s2相同,则
-
如果s1与s2不同,则返回-1,否则返回ans
示例
让我们看一下以下实现,以更好的理解 –
def solve(nums1, nums2):
s1 = sum(nums1)
s2 = sum(nums2)
nums1.sort()
nums2.sort()
if s1>s2:
nums1,nums2 = nums2,nums1
s1,s2 = s2,s1
ans = 0
left,right = 0,len(nums2)-1
while(left=0):
if s1==s2:
返回词
curr_left = nums1[left] if left=0 else 0
if 6-curr_left>=curr_right-1:
s1+= min(6-curr_left, s2-s1)
left+=1
else:
s2-= min(curr_right-1, s2-s1)
right-=1
ans+=1
return -1 if s1!=s2 else ans
nums1 = [1,5,6]
nums2 = [4,1,1]
print(solve(nums1, nums2))
输入
[1,5,6],[4,1,1]
输出
2