Minimum swaps of same-indexed elements required to make sum of two given arrays even
Given two arrays arr1[] and arr2[] of size N, the task is to count the minimum number of swaps of same-indexed elements from both the arrays arr1[] and arr2[] required to make the sum of all elements of both the arrays even. If it is not possible, then print “-1”.
Examples:
Input: arr1[] = {1, 4, 2, 3}, arr2[] = {2, 3, 4, 1}
Output: 0
Explanation: Sum of all elements of arr1[] and arr2[] is 10 and 10 respectively, which is already even. Therefore, the count of operations required is 0.
Input: arr1[] = {11, 14, 20, 2}, arr2[] = {5, 9, 6, 3}
Output: 1
Explanation: Sum of all elements of arr1[] and arr2[] is 37 and 23 respectively. Swapping arr1[1]( = 14) and arr2[1]( = 9) makes the sum of arr1[] and arr2[], 32 and 28 respectively. Therefore, the count of operations required is 1.
Approach: The idea is based on the following observations assuming that the sum of the array arr1[] is sumArr1 and that of arr2[] is sumArr2.
- If sumArr1 is even and sumArr2 is even: No swaps required.
- If sumArr1 is odd and sumArr2 is odd: Find a pair of same-indexed elements whose sum is odd and swap them. Such a pair contains one even number and an odd number. Swapping them increases the sum of one array by 1 and decreases that of the other array by 1. Therefore, sum of both the arrays is even.
- If sumArr1 is even and sumArr2 is odd: Not possible to make sum of both the arrays even.
- If sumArr1 is odd and sumArr2 is even: Not possible to make sum of both the arrays even.
Follow the steps below to solve the problem:
- Initialize sumArr1 = 0 and sumArr2 = 0 to store the sum of arr1[] and arr2[] respectively.
- If sumArr1 and sumArr2 are both found to be even, then print 0.
- If sumArr1 and sumArr2 are both found to be odd, then iterate a loop over the range [0, N – 1] and check if there exists any corresponding pair whose sum is odd or not. If any such pair is found, then print 1.
- Otherwise, for all other cases, print -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void minimumSwaps( int arr1[], int arr2[],
int n)
{
int sumArr1 = 0, sumArr2 = 0;
for ( int i = 0; i < n; ++i) {
sumArr1 += arr1[i];
sumArr2 += arr2[i];
}
if (sumArr1 % 2 == 0
&& sumArr2 % 2 == 0) {
cout << 0;
return ;
}
if (sumArr1 % 2 != 0
&& sumArr2 % 2 != 0) {
int flag = -1;
for ( int i = 0; i < n; ++i) {
if ((arr1[i] + arr2[i]) % 2 == 1){
flag = 1;
break ;
}
}
cout << flag;
return ;
}
cout << -1;
}
int main()
{
int arr1[] = { 11, 14, 20, 2 };
int arr2[] = { 5, 9, 6, 3 };
int N = sizeof (arr1) / sizeof (arr1[0]);
minimumSwaps(arr1, arr2, N);
return 0;
}
|
Java
import java.io.*;
class GFG{
static void minimumSwaps( int arr1[], int arr2[],
int n)
{
int sumArr1 = 0 , sumArr2 = 0 ;
for ( int i = 0 ; i < n; ++i)
{
sumArr1 += arr1[i];
sumArr2 += arr2[i];
}
if (sumArr1 % 2 == 0 && sumArr2 % 2 == 0 )
{
System.out.print( 0 );
return ;
}
if (sumArr1 % 2 != 0 && sumArr2 % 2 != 0 )
{
int flag = - 1 ;
for ( int i = 0 ; i < n; ++i)
{
if ((arr1[i] + arr2[i]) % 2 == 1 )
{
flag = 1 ;
break ;
}
}
System.out.print(flag);
return ;
}
System.out.print(- 1 );
}
public static void main(String[] args)
{
int arr1[] = { 11 , 14 , 20 , 2 };
int arr2[] = { 5 , 9 , 6 , 3 };
int N = arr1.length;
minimumSwaps(arr1, arr2, N);
}
}
|
Python3
def minimumSwaps(arr1, arr2, n):
sumArr1 = 0 ; sumArr2 = 0 ;
for i in range (n):
sumArr1 + = arr1[i];
sumArr2 + = arr2[i];
if (sumArr1 % 2 = = 0 and sumArr2 % 2 = = 0 ):
print ( 0 );
return ;
if (sumArr1 % 2 ! = 0 and sumArr2 % 2 ! = 0 ):
flag = - 1 ;
for i in range (n):
if ((arr1[i] + arr2[i]) % 2 = = 1 ):
flag = 1 ;
break ;
print (flag);
return ;
print ( - 1 );
if __name__ = = '__main__' :
arr1 = [ 11 , 14 , 20 , 2 ];
arr2 = [ 5 , 9 , 6 , 3 ];
N = len (arr1);
minimumSwaps(arr1, arr2, N);
|
C#
using System;
class GFG{
static void minimumSwaps( int [] arr1, int [] arr2,
int n)
{
int sumArr1 = 0, sumArr2 = 0;
for ( int i = 0; i < n; ++i)
{
sumArr1 += arr1[i];
sumArr2 += arr2[i];
}
if (sumArr1 % 2 == 0 && sumArr2 % 2 == 0)
{
Console.Write(0);
return ;
}
if (sumArr1 % 2 != 0 && sumArr2 % 2 != 0)
{
int flag = -1;
for ( int i = 0; i < n; ++i)
{
if ((arr1[i] + arr2[i]) % 2 == 1)
{
flag = 1;
break ;
}
}
Console.Write(flag);
return ;
}
Console.Write(-1);
}
public static void Main()
{
int [] arr1 = { 11, 14, 20, 2 };
int [] arr2 = { 5, 9, 6, 3 };
int N = arr1.Length;
minimumSwaps(arr1, arr2, N);
}
}
|
Javascript
<script>
function minimumSwaps(arr1, arr2, n)
{
let sumArr1 = 0, sumArr2 = 0;
for (let i = 0; i < n; ++i)
{
sumArr1 += arr1[i];
sumArr2 += arr2[i];
}
if (sumArr1 % 2 == 0 && sumArr2 % 2 == 0)
{
document.write(0);
return ;
}
if (sumArr1 % 2 != 0 && sumArr2 % 2 != 0)
{
let flag = -1;
for (let i = 0; i < n; ++i)
{
if ((arr1[i] + arr2[i]) % 2 == 1)
{
flag = 1;
break ;
}
}
document.write(flag);
return ;
}
document.write(-1);
}
let arr1 = [ 11, 14, 20, 2 ];
let arr2 = [ 5, 9, 6, 3 ];
let N = arr1.length;
minimumSwaps(arr1, arr2, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Last Updated :
18 Nov, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...