Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 두 배열의 합을 같게 만드는 데 필요한 최소 연산을 찾는 프로그램

<시간/>

두 개의 목록 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