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
- 현재 :=현재 + 델타
- mx_same :=현재 및 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