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

Python에서 최소 연산 수로 동일한 합 배열을 찾는 프로그램

<시간/>

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