두 개의 목록 nums1과 nums2가 있고 여기에서 두 목록의 각 요소는 범위 1에서 6까지입니다. 이제 nums1 또는 nums2에서 숫자를 선택하고 해당 값을 1에서 6 사이의 숫자로 업데이트할 수 있는 작업을 고려합니다. 이 두 배열의 합이 같도록 필요한 최소 연산 수를 찾아야 합니다. 솔루션을 찾을 수 없으면 -1을 반환합니다.
따라서 입력이 nums1 =[1, 4] nums2 =[5, 4, 4]와 같으면 출력은 2가 됩니다. 왜냐하면 nums1에서 6까지 1을 만들 수 있으므로 nums1의 합은 10이기 때문입니다. nums2에서 1까지 중 하나 4이므로 합도 10입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
sa :=nums1에 있는 모든 요소의 합
-
sb :=nums2에 있는 모든 요소의 합
-
sa> sb이면
-
nums1과 nums2를 교환
-
sa와 sb 교환
-
-
목록 nums1 정렬
-
목록 nums2를 역순으로 정렬
-
해상도 :=0
-
toadd :=sb - sa
-
i :=0, j :=0
-
toadd> 0 동안 수행
-
해상도 :=해상도 + 1
-
i
-
resa :=6 - nums1[i]
-
resb :=nums2[j] - 1
-
resa> resb인 경우
-
toadd :=toadd - resa
-
나는 :=나는 + 1
-
-
그렇지 않으면
-
toadd :=toadd - resb
-
j :=j + 1
-
-
그렇지 않으면 i
-
resa :=6 - nums1[i]
-
toadd :=toadd - resa
-
나는 :=나는 + 1
-
-
그렇지 않으면 j
-
resb :=nums2[j] - 1
-
toadd :=toadd - resb
-
j :=j + 1
-
-
그렇지 않으면
-
반환 -1
-
-
-
-
반환 해상도
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다.
def solve(nums1, nums2): sa = sum(nums1) sb = sum(nums2) if sa > sb: nums1, nums2 = nums2, nums1 sa, sb = sb, sa nums1.sort() nums2.sort(reverse=True) res = 0 toadd = sb - sa i = 0 j = 0 while toadd > 0: res += 1 if i < len(nums1) and j < len(nums2): resa = 6 - nums1[i] resb = nums2[j] - 1 if resa > resb: toadd -= resa i += 1 else: toadd -= resb j += 1 elif i < len(nums1): resa = 6 - nums1[i] toadd -= resa i += 1 elif j < len(nums2): resb = nums2[j] - 1 toadd -= resb j += 1 else: return -1 return res nums1 = [1, 4] nums2 = [5, 4, 4] print(solve(nums1, nums2))
입력
[2,1,4,3,5,4]
출력
2