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

파이썬에서 첫 번째와 끝에서 쌍을 만드는 데 필요한 연산의 수를 찾는 프로그램은 합이 같습니다.

<시간/>

nums라는 숫자 목록이 있다고 가정합니다. 이 목록의 길이는 짝수입니다. 이제 숫자에서 임의의 숫자를 선택하고 [1 및 최대 숫자] 범위의 값으로 업데이트하는 작업을 고려하십시오. 모든 i에 대해 nums[i] + nums[n-1-i]가 동일한 수와 같도록 요구되는 그러한 연산의 최소 수를 찾아야 합니다.

따라서 입력이 nums =[8,6,2,5,9,2]와 같으면 출력은 2가 됩니다. 왜냐하면 nums[2]에서 처음 2를 5로, 9를 nums[4에서 변경하기 때문입니다. ] ~ 4, 요소는 [8,6,5,5,4,2]가 되고 각 i에 대한 nums[i] + nums[n-1-i]는 (8+2) =( 6+4) =(5+5) =10.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • N :=숫자 크기
  • mx :=최대 숫자
  • 이벤트 :=새 목록
  • idx :=0
  • idx
  • a :=숫자[idx]
  • b :=숫자[N - idx - 1]
  • 이벤트 끝에 쌍(최소 (a + 1), (b + 1), 1) 삽입
  • 이벤트 끝에 쌍(a + b, 1) 삽입
  • 이벤트 끝에 쌍(a + b + 1, -1) 삽입
  • 이벤트 끝에 쌍(최대 (a + mx) 및 (b + mx + 1), -1) 삽입
  • idx :=idx + 1
  • 목록 이벤트 정렬
  • 현재 :=0
  • mx_same :=0
  • 이벤트의 각 쌍(이벤트, 델타)에 대해 다음을 수행합니다.
    • 현재 :=현재 + 델타
    • mx_same :=현재 및 mx_same의 최대값
  • N 반환 - mx_same
  • 예시

    이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

    def solve(nums):
       N = len(nums)
       mx = max(nums)
       events = []
    
       idx = 0
       while idx < N // 2:
          a = nums[idx]
          b = nums[N - idx - 1]
    
          events.append((min(a + 1, b + 1), 1))
          events.append((a + b, 1))
          events.append((a + b + 1, -1))
          events.append((max(a + mx, b + mx) + 1, -1))
    
       idx += 1
    
       events.sort()
       current = 0
       mx_same = 0
    
       for event, delta in events:
          current += delta
          mx_same = max(current, mx_same)
    
       return N - mx_same
    
    nums = [8,6,2,5,9,2]
    print(solve(nums))

    입력

    [6, 8, 5, 2, 3]

    출력

    2