给定数组A [],该任务用于查找修改给定数组A []所需的最小交换操作,以便对于数组中的每个索引, parity(i)= parity(A [i])其中parity(x)= x%2 。如果无法获得这样的安排,则打印-1。
例子:
Input: A[] = { 2, 4, 3, 1, 5, 6 }
Output: 2
Explanation:
Swapping (4, 3) and (5, 6) modifies the array to [2, 3, 4, 1, 6, 5] such that the parity of i and A[i] is same for all indices.
Input: A[] = {1, 2, 5, 7}
Output: -1
Explanation:
The given array cannot be rearranged as per required condition.
方法:
为了解决上述问题,一种最佳方法是选择奇偶校验(i)和奇偶校验(A [i])不相同的索引。
- 将两个变量Needodd和Needeven初始化为0 ,这将存储每个元素的奇偶校验。检查索引的奇偶性是否为奇数,然后将Needodd值增加1,否则增加Needeven 。
- 如果需求和需求不相同,则不可能进行所需的安排。
- 否则,最终结果将由Needodd变量获得,因为它是所需的操作数。这是因为在任何时候,我们都选择一个奇偶校验元素,其奇偶校验与它们的索引奇偶校验不相同,并且类似地选择一个偶数元素并交换它们。
下面是上述方法的实现:
C++
// C++ implementation to minimize
// swaps required to rearrange
// array such that parity of index and
// corresponding element is same
#include
using namespace std;
// Function to return the
// parity of number
int parity(int x)
{
return x % 2;
}
// Function to return minimum
// number of operations required
int solve(int a[], int size)
{
// Initialize needodd and
// needeven value by 0
int needeven = 0;
int needodd = 0;
for(int i = 0; i < size; i++)
{
if(parity(i) != parity(a[i]))
{
// Check if parity(i) is odd
if(parity(i) % 2)
{
// increase needodd
// as we need odd no
// at that position.
needodd++;
}
else
{
// increase needeven
// as we need even
// number at that position
needeven++;
}
}
}
// If needeven and needodd are unequal
if(needeven != needodd)
return -1;
else
return needodd;
}
// Driver Code
int main()
{
int a[] = { 2, 4, 3, 1, 5, 6};
int n = sizeof(a) / sizeof(a[0]);
// Function call
cout << solve(a, n) << endl;
return 0;
}
// This code is contributed by venky07
Java
// Java implementation to minimize
// swaps required to rearrange
// array such that parity of index and
// corresponding element is same
import java.util.*;
class GFG{
// Function to return the
// parity of number
static int parity(int x)
{
return x % 2;
}
// Function to return minimum
// number of operations required
static int solve(int a[], int size)
{
// Initialize needodd and
// needeven value by 0
int needeven = 0;
int needodd = 0;
for(int i = 0; i < size; i++)
{
if(parity(i) != parity(a[i]))
{
// Check if parity(i) is odd
if(parity(i) % 2 == 1)
{
// Increase needodd
// as we need odd no
// at that position.
needodd++;
}
else
{
// Increase needeven
// as we need even
// number at that position
needeven++;
}
}
}
// If needeven and needodd are unequal
if(needeven != needodd)
return -1;
else
return needodd;
}
// Driver Code
public static void main (String[] args)
{
int a[] = { 2, 4, 3, 1, 5, 6};
int n = a.length;
// Function call
System.out.println(solve(a, n));
}
}
// This code is contributed by offbeat
Python3
# Python3 implementation to minimize
# swaps required to rearrange
# array such that parity of index and
# corresponding element is same
# Function to return the
# parity of number
def parity(x):
return x % 2
# Function to return minimum
# number of operations required
def solve(a, size):
# Initialize needodd and
# needeven value by 0
needeven = 0
needodd = 0
for i in range(size):
if parity(i)!= parity(a[i]):
# Check if parity(i) is odd
if parity(i) % 2:
# increase needodd
# as we need odd no
# at that position.
needodd+= 1
else:
# increase needeven
# as we need even
# number at that position
needeven+= 1
# If needeven and needodd are unequal
if needodd != needeven:
return -1
return needodd
# Driver code
if __name__ =="__main__":
a = [2, 4, 3, 1, 5, 6]
n = len(a)
print(solve(a, n))
C#
// C# implementation to minimize
// swaps required to rearrange
// array such that parity of index and
// corresponding element is same
using System;
class GFG{
// Function to return the
// parity of number
static int parity(int x)
{
return x % 2;
}
// Function to return minimum
// number of operations required
static int solve(int[] a, int size)
{
// Initialize needodd and
// needeven value by 0
int needeven = 0;
int needodd = 0;
for(int i = 0; i < size; i++)
{
if(parity(i) != parity(a[i]))
{
// Check if parity(i) is odd
if(parity(i) % 2 == 1)
{
// Increase needodd
// as we need odd no
// at that position.
needodd++;
}
else
{
// Increase needeven
// as we need even
// number at that position
needeven++;
}
}
}
// If needeven and needodd are unequal
if(needeven != needodd)
return -1;
else
return needodd;
}
// Driver Code
public static void Main ()
{
int[] a = {2, 4, 3, 1, 5, 6};
int n = a.Length;
// Function call
Console.Write(solve(a, n));
}
}
// This code is contributed by Chitranayal
Javascript
输出:
2