
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Find Minimum Moves to Make Array Complementary in Python
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
Advertisements