Giả sử chúng ta có một danh sách các số được gọi là nums. Độ dài của danh sách này là thậm chí. Bây giờ hãy xem xét một phép toán trong đó chúng ta chọn bất kỳ số nào trong nums và cập nhật nó với một giá trị trong phạm vi [1 và tối đa là nums]. Chúng ta phải tìm số lượng tối thiểu các phép toán như vậy được yêu cầu sao cho với mọi i, nums [i] + nums [n-1-i] bằng cùng một số.
Vì vậy, nếu đầu vào giống như nums =[8,6,2,5,9,2], thì đầu ra sẽ là 2, bởi vì nếu chúng ta thay đổi 2 đầu tiên tại nums [2] thành 5 và 9 tại nums [4 ] đến 4, thì các phần tử sẽ là [8,6,5,5,4,2], sau đó nums [i] + nums [n-1-i] cho mỗi i sẽ là (8 + 2) =( 6 + 4) =(5 + 5) =10.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- N:=kích thước của nums
- mx:=tối đa là nums
- sự kiện:=một danh sách mới
- idx:=0
- while idx
- a:=nums [idx]
- b:=nums [N - idx - 1]
- chèn một cặp (tối thiểu là (a + 1), (b + 1), 1) vào cuối sự kiện
- chèn một cặp (a + b, 1) vào cuối sự kiện
- chèn một cặp (a + b + 1, -1) vào cuối sự kiện
- chèn một cặp (tối đa là (a + mx) và (b + mx + 1), -1) vào cuối sự kiện
- idx:=idx + 1
- current:=current + delta
- mx_same:=tối đa hiện tại và mx_same
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
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))
Đầu vào
[6, 8, 5, 2, 3]
Đầu ra
2