给定两个大小为N的数组arr1 []和arr2 [] ,任务是从两个数组arr1 []和arr2 []的相等索引元素的交换的最小数目中进行求和,以使两个数组的所有元素之和数组甚至。如果不可能,则打印“ -1” 。
例子:
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.
方法:这个想法基于以下观察,假设数组arr1 []的总和为sumArr1 ,而arr2 []的总和为sumArr2 。
- 如果sumArr1为偶数且sumArr2为偶数:不需要交换。
- 如果sumArr1为奇数,sumArr2为奇数:找到一对总和为奇数的相同索引元素,然后交换它们。这样的一对包含一个偶数和一个奇数。交换它们会使一个数组的总和增加1 ,而将另一个数组的总和减少1 。因此,两个数组的总和是偶数。
- 如果sumArr1为偶数且sumArr2为奇数:不可能使两个数组的和为偶数。
- 如果sumArr1为奇数而sumArr2为偶数:不可能使两个数组的和为偶数。
请按照以下步骤解决问题:
- 初始化sumArr1 = 0和sumArr2 = 0分别存储arr1 []和arr2 []的和。
- 如果发现sumArr1和sumArr2都为偶数,则打印0 。
- 如果发现sumArr1和sumArr2都为奇数,则在[0,N – 1]范围内循环循环,并检查是否存在总和为奇数的对应对。如果找到任何这样的对,则打印1 。
- 否则,对于所有其他情况,请打印-1 。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to count the minimum swaps
// of same-indexed elements from arrays
// arr1[] and arr2[] required to make
// the sum of both the arrays even
void minimumSwaps(int arr1[], int arr2[],
int n)
{
// Store the sum of elements of
// the array arr1 and arr2 respectively
int sumArr1 = 0, sumArr2 = 0;
// Store the array sum of both the arrays
for (int i = 0; i < n; ++i) {
sumArr1 += arr1[i];
sumArr2 += arr2[i];
}
// If both sumArr1 and sumArr2
// are even, print 0 and return
if (sumArr1 % 2 == 0
&& sumArr2 % 2 == 0) {
cout << 0;
return;
}
// If both sumArr1 and sumArr2
// are odd and check for a pair
// with sum odd sum
if (sumArr1 % 2 != 0
&& sumArr2 % 2 != 0) {
// Stores if a pair with
// odd sum exists or not
int flag = -1;
// Traverse the array
for (int i = 0; i < n; ++i) {
// If a pair exists with odd
// sum, set flag = 1
if ((arr1[i] + arr2[i]) % 2 == 1){
flag = 1;
break;
}
}
// Print the answer and return
cout << flag;
return;
}
// For all other cases, print -1
cout << -1;
}
// Driver Code
int main()
{
int arr1[] = { 11, 14, 20, 2 };
int arr2[] = { 5, 9, 6, 3 };
int N = sizeof(arr1) / sizeof(arr1[0]);
// Function Call
minimumSwaps(arr1, arr2, N);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG{
// Function to count the minimum swaps
// of same-indexed elements from arrays
// arr1[] and arr2[] required to make
// the sum of both the arrays even
static void minimumSwaps(int arr1[], int arr2[],
int n)
{
// Store the sum of elements of
// the array arr1 and arr2 respectively
int sumArr1 = 0, sumArr2 = 0;
// Store the array sum of both the arrays
for(int i = 0; i < n; ++i)
{
sumArr1 += arr1[i];
sumArr2 += arr2[i];
}
// If both sumArr1 and sumArr2
// are even, print 0 and return
if (sumArr1 % 2 == 0 && sumArr2 % 2 == 0)
{
System.out.print(0);
return;
}
// If both sumArr1 and sumArr2
// are odd and check for a pair
// with sum odd sum
if (sumArr1 % 2 != 0 && sumArr2 % 2 != 0)
{
// Stores if a pair with
// odd sum exists or not
int flag = -1;
// Traverse the array
for(int i = 0; i < n; ++i)
{
// If a pair exists with odd
// sum, set flag = 1
if ((arr1[i] + arr2[i]) % 2 == 1)
{
flag = 1;
break;
}
}
// Print the answer and return
System.out.print(flag);
return;
}
// For all other cases, print -1
System.out.print(-1);
}
// Driver code
public static void main(String[] args)
{
int arr1[] = { 11, 14, 20, 2 };
int arr2[] = { 5, 9, 6, 3 };
int N = arr1.length;
// Function Call
minimumSwaps(arr1, arr2, N);
}
}
// This code is contributed by jithin
Python3
# Python program for the above approach
# Function to count the minimum swaps
# of same-indexed elements from arrays
# arr1 and arr2 required to make
# the sum of both the arrays even
def minimumSwaps(arr1, arr2, n):
# Store the sum of elements of
# the array arr1 and arr2 respectively
sumArr1 = 0; sumArr2 = 0;
# Store the array sum of both the arrays
for i in range(n):
sumArr1 += arr1[i];
sumArr2 += arr2[i];
# If both sumArr1 and sumArr2
# are even, pr0 and return
if (sumArr1 % 2 == 0 and sumArr2 % 2 == 0):
print(0);
return;
# If both sumArr1 and sumArr2
# are odd and check for a pair
# with sum odd sum
if (sumArr1 % 2 != 0 and sumArr2 % 2 != 0):
# Stores if a pair with
# odd sum exists or not
flag = -1;
# Traverse the array
for i in range(n):
# If a pair exists with odd
# sum, set flag = 1
if ((arr1[i] + arr2[i]) % 2 == 1):
flag = 1;
break;
# Prthe answer and return
print(flag);
return;
# For all other cases, pr-1
print(-1);
# Driver code
if __name__ == '__main__':
arr1 = [11, 14, 20, 2];
arr2 = [5, 9, 6, 3];
N = len(arr1);
# Function Call
minimumSwaps(arr1, arr2, N);
# This code is contributed by 29AjayKumar
C#
// C# program to implement
// the above approach
using System;
class GFG{
// Function to count the minimum swaps
// of same-indexed elements from arrays
// arr1[] and arr2[] required to make
// the sum of both the arrays even
static void minimumSwaps(int[] arr1, int[] arr2,
int n)
{
// Store the sum of elements of
// the array arr1 and arr2 respectively
int sumArr1 = 0, sumArr2 = 0;
// Store the array sum of both the arrays
for(int i = 0; i < n; ++i)
{
sumArr1 += arr1[i];
sumArr2 += arr2[i];
}
// If both sumArr1 and sumArr2
// are even, print 0 and return
if (sumArr1 % 2 == 0 && sumArr2 % 2 == 0)
{
Console.Write(0);
return;
}
// If both sumArr1 and sumArr2
// are odd and check for a pair
// with sum odd sum
if (sumArr1 % 2 != 0 && sumArr2 % 2 != 0)
{
// Stores if a pair with
// odd sum exists or not
int flag = -1;
// Traverse the array
for(int i = 0; i < n; ++i)
{
// If a pair exists with odd
// sum, set flag = 1
if ((arr1[i] + arr2[i]) % 2 == 1)
{
flag = 1;
break;
}
}
// Print the answer and return
Console.Write(flag);
return;
}
// For all other cases, print -1
Console.Write(-1);
}
// Driver code
public static void Main()
{
int[] arr1 = { 11, 14, 20, 2 };
int[] arr2 = { 5, 9, 6, 3 };
int N = arr1.Length;
// Function Call
minimumSwaps(arr1, arr2, N);
}
}
// This code is contributed by susmitakundugoaldanga
1
时间复杂度: O(N)
辅助空间: O(1)