Suppose we have an array nums of even length another value limit. In one move, we can replace any value from nums with another value between 1 and limit, inclusive. The array is said to be complementary if for all indices i, nums[i] + nums[n-1-i] equals the same number. So we have to find the minimum number of moves required to make nums complementary.
So, if the input is like nums = [1,4,2,3] limit = 4, then the output will be 1 because in one move we can make element at index 1 to 2, so array will be [1,2,2,3], then nums[0] + nums[3] = 4, nums[1] + nums[2] = 4, nums[2] + nums[1] = 4, nums[3] + nums[0] = 4
To solve this, we will follow these steps −
- n := size of nums
- mid := quotient of n/2
- zero_moves := an empty map of integer type value
- start := an array of size (2 * limit + 1), and fill with 0
- end := an array of size (2 * limit + 1), and fill with 0
- res := infinity
- for i in range 0 to mid - 1, do
- x := nums[i]
- y := nums[n - 1 - i]
- zero_moves[x + y] := zero_moves[x + y] + 1
- increase start[1 + minimum of x, y] by 1
- increase end[limit + maximum of x, y] by 1
- intervals := 0
- for target in range 2 to limit*2, do
- intervals := intervals + start[target]
- cost := 2 *(mid - intervals) + intervals - zero_moves[target]
- res := minimum of res and cost
- intervals := intervals - end[target]
- return res
Example
Let us see the following implementation to get better understanding −
from collections import defaultdict def solve(nums, limit): n = len(nums) mid = n // 2 zero_moves = defaultdict(int) start = [0] * (2 * limit + 1) end = [0] * (2 * limit + 1) res = float('inf') for i in range(mid): x = nums[i] y = nums[n - 1 - i] zero_moves[x + y] += 1 start[min(x, y) + 1] += 1 end[max(x, y) + limit] += 1 intervals = 0 for target in range(2, limit * 2 + 1): intervals += start[target] cost = 2 * (mid - intervals) + intervals - zero_moves[target] res = min(res, cost) intervals -= end[target] return res nums = [1,4,2,3] limit = 4 print(solve(nums, limit))
Input
[1,4,2,3], 4
Output
1