nums1과 nums2라는 두 개의 배열이 있다고 가정합니다. 배열의 값은 1에서 6(포함) 사이입니다. 한 번의 연산으로 배열의 값을 1에서 6 사이의 값으로 업데이트할 수 있습니다. nums1의 값 합계를 nums2의 값 합계와 같게 만드는 데 필요한 최소 연산 수를 찾아야 합니다. 가능하지 않으면 -1을 반환해야 합니다.
따라서 입력이 nums1 =[1,5,6], nums2 =[4,1,1]과 같으면 nums2를 [4,1,1]에서 [4, 1,6] 첫 번째 작업에서 [4,2,6] 두 번째 작업에서 nums1과 동일하게 만듭니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
s1 :=nums1에 있는 모든 요소의 합
-
s2 :=nums2에 있는 모든 요소의 합
-
목록 nums1 정렬 및 목록 nums2 정렬
-
s1> s2이면
-
nums1과 nums2 교환
-
s1과 s2를 교환
-
-
답변 :=0
-
왼쪽 :=0, 오른쪽 :=nums2의 크기 -1
-
동안 왼쪽
=0, 수행 -
s1이 s2와 같으면
-
반환
-
-
curr_left :=nums1[left] 왼쪽
-
curr_right :=nums2[right] 맞으면>=0 그렇지 않으면 0
-
6-curr_left>=curr_right-1이면
-
s1 :=s1 + 최소 6-curr_left 및 s2-s1
-
왼쪽 :=왼쪽 + 1
-
-
그렇지 않으면
-
s2 :=s2 - curr_right-1 및 s2-s1의 최소값
-
오른쪽 :=오른쪽 - 1
-
-
ans :=ans + 1
-
-
s1이 s2와 같지 않으면 -1을 반환하고 그렇지 않으면
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
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<len(nums1) or right>=0): if s1==s2: return ans curr_left = nums1[left] if left<len(nums1) else 7 curr_right = nums2[right] if right>=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