Permutación de Array tal que los productos de todos los elementos adyacentes son pares

Dada una array arr[] que consiste en N enteros positivos, la tarea es encontrar cualquier permutación de la array dada tal que el producto de los elementos adyacentes sea par. Imprime cualquier permutación o -1 si no es posible.

Ejemplo:

Entrada: arr[] = {6,7,9,8,10,11}
Salida: 8 9 10 7 6 11
Explicación: 
Producto de elementos adyacentes =>
8 x 9 = 72 (par)
9 x 10 = 90 (par )
10 x 7 = 70 (par)
7 x 6 = 42 (par)
6 x 11 = 66 (par)

Entrada: arr[] = {3,2,5,7,1,4,9}
Salida : -1
Explicación: No hay arreglos posibles de elementos tales que el producto de elementos adyacentes sea igual.

 

Enfoque ingenuo: el enfoque más simple para resolver este problema es probar todos los arreglos posibles de los elementos y verificar que la condición sea verdadera.

Complejidad de tiempo: O(N*N!) donde N es el número de elementos en la array. O(N!) es el tiempo necesario para crear todas las permutaciones de la array dada y O(N) es el tiempo necesario para comprobar si la permutación actual es la necesaria o no.
Espacio auxiliar: O(N) para almacenar la permutación cada vez.

Enfoque eficiente: la solución se puede encontrar usando observaciones simples. Si hay varios elementos pares e impares en la array, una disposición óptima de los elementos adyacentes puede ser cualquiera de los siguientes casos para que el producto sea par:

{Impar, Par} 
{Par, Impar}
{Par, Par}

Tenga en cuenta que la disposición {Impar, Impar} de cualquier elemento adyacente dará como resultado un producto impar. Por lo tanto, este arreglo no es posible. 

Las disposiciones anteriores sólo son posibles si 

número_de_elementos_impares <= número_de_elementos_pares + 1 en la array.

Siga los pasos a continuación para resolver el problema.

  1. Tome dos vectores pares e impares para almacenar los elementos pares e impares de la array por separado.
  2. Si el tamaño del vector impar es mayor que el tamaño del vector par + 1 (como se explicó anteriormente), entonces la solución no es posible. Por lo tanto, imprima -1 .
  3. De lo contrario, primero imprima un elemento del vector impar y luego un elemento del vector par hasta que ambos vectores estén vacíos.

A continuación se muestra la implementación del enfoque anterior.

C++

// C++ program to Permutation of Array
// such that product of all
// adjacent elements is even
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to print
// the required permutation
 
void printPermutation(int arr[], int n)
{
    vector<int> odd, even;
 
    // push odd elements in 'odd'
    // and even elements in 'even'
    for (int i = 0; i < n; i++) {
 
        if (arr[i] % 2 == 0)
            even.push_back(arr[i]);
        else
            odd.push_back(arr[i]);
    }
 
    int size_odd = odd.size();
    int size_even = even.size();
 
    // Check if it possible to
    // arrange the elements
    if (size_odd > size_even + 1)
        cout << -1 << endl;
 
    // else print the permutation
    else {
 
        int i = 0;
        int j = 0;
 
        while (i < size_odd && j < size_even) {
 
            cout << odd[i] << " ";
            ++i;
            cout << even[j] << " ";
            ++j;
        }
 
        // Print remaining odds are even.
        // and even elements
        while (i < size_odd) {
            cout << odd[i] << " ";
            ++i;
        }
 
        while (j < size_even) {
            cout << even[j] << " ";
        }
    }
}
 
// Driver code
int main()
{
    int arr[] = { 6, 7, 9, 8, 10, 11 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    printPermutation(arr, N);
    return 0;
}

Java

// Java program to permutation of array
// such that product of all adjacent
// elements is even
import java.io.*;
import java.util.*;
 
class GFG{
     
// Function to print
// the required permutation
static void printPermutation(int arr[], int n)
{
    ArrayList<Integer> odd = new ArrayList<Integer>();
    ArrayList<Integer> even = new ArrayList<Integer>();
     
    // push odd elements in 'odd'
    // and even elements in 'even'
    for(int i = 0; i < n; i++)
    {
         if (arr[i] % 2 == 0)
              even.add(arr[i]);
           else
              odd.add(arr[i]);
    }
   
    int size_odd = odd.size();
    int size_even = even.size();
   
    // Check if it possible to
    // arrange the elements
    if (size_odd > size_even + 1)
        System.out.println("-1");
 
    // Else print the permutation
    else
    {
        int i = 0;
        int j = 0;
 
        while (i < size_odd && j < size_even)
        {
            System.out.print(odd.get(i) + " ");
            ++i;
            System.out.print(even.get(j) + " ");
            ++j;
        }
 
        // Print remaining odds are even.
        // and even elements
        while (i < size_odd)
        {
            System.out.print(odd.get(i) + " ");
            ++i;
        }
        while (j < size_even)
        {
            System.out.print(even.get(j) + " ");
        }
    }
}
 
// Driver Code
public static void main (String[] args)
{
    int arr[] = { 6, 7, 9, 8, 10, 11 };
    int N = arr.length;
 
    printPermutation(arr, N);
}
}
 
// This code is contributed by offbeat

Python3

# Python3 program to Permutation of Array
# such that product of all
# adjacent elements is even
 
# Function to print
# the required permutation
def printPermutation(arr, n):
 
    odd, even = [], []
 
    # push odd elements in 'odd'
    # and even elements in 'even'
    for i in range(n):
        if(arr[i] % 2 == 0):
            even.append(arr[i])
        else:
            odd.append(arr[i])
 
    size_odd = len(odd)
    size_even = len(even)
 
    # Check if it possible to
    # arrange the elements
    if(size_odd > size_even + 1):
        print(-1)
 
    # else print the permutation
    else:
        i, j = 0, 0
 
        while(i < size_odd and j < size_even):
             
            print(odd[i], end = " ")
            i += 1
            print(even[j], end = " ")
            j += 1
 
    # Print remaining odds are even.
    # and even elements
    while(i < size_odd):
        print(odd[i], end = " ")
        i += 1
 
    while(j < size_even):
        print(even[j], end = " ")
        j += 1
 
# Driver Code
arr = [ 6, 7, 9, 8, 10, 11 ]
 
N = len(arr)
 
# Function call
printPermutation(arr, N)
 
# This code is contributed by Shivam Singh

C#

// C# program to permutation of array
// such that product of all adjacent
// elements is even
using System;
using System.Collections.Generic;
 
class GFG{
     
// Function to print
// the required permutation
static void printPermutation(int []arr, int n)
{
    List<int> odd = new List<int>();
    List<int> even = new List<int>();
     
    // push odd elements in 'odd'
    // and even elements in 'even'
    for(int i = 0; i < n; i++)
    {
        if (arr[i] % 2 == 0)
            even.Add(arr[i]);
        else
            odd.Add(arr[i]);
    }
 
    int size_odd = odd.Count;
    int size_even = even.Count;
 
    // Check if it possible to
    // arrange the elements
    if (size_odd > size_even + 1)
        Console.WriteLine("-1");
 
    // Else print the permutation
    else
    {
        int i = 0;
        int j = 0;
 
        while (i < size_odd && j < size_even)
        {
            Console.Write(odd[i] + " ");
            ++i;
            Console.Write(even[j] + " ");
            ++j;
        }
 
        // Print remaining odds are even.
        // and even elements
        while (i < size_odd)
        {
            Console.Write(odd[i] + " ");
            ++i;
        }
        while (j < size_even)
        {
            Console.Write(even[j] + " ");
        }
    }
}
 
// Driver Code
public static void Main(String[] args)
{
    int []arr = { 6, 7, 9, 8, 10, 11 };
    int N = arr.Length;
 
    printPermutation(arr, N);
}
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
 
// JavaScript program to permutation of array
// such that product of all adjacent
// elements is even
 
// Function to print
// the required permutation
function printPermutation(arr, n)
{
    let odd = [];
    let even = [];
       
    // push odd elements in 'odd'
    // and even elements in 'even'
    for(let i = 0; i < n; i++)
    {
        if (arr[i] % 2 == 0)
            even.push(arr[i]);
        else
            odd.push(arr[i]);
    }
   
    let size_odd = odd.length;
    let size_even = even.length;
   
    // Check if it possible to
    // arrange the elements
    if (size_odd > size_even + 1)
        document.write("-1");
   
    // Else print the permutation
    else
    {
        let i = 0;
        let j = 0;
   
        while (i < size_odd && j < size_even)
        {
            document.write(odd[i] + " ");
            ++i;
            document.write(even[j] + " ");
            ++j;
        }
   
        // Print remaining odds are even.
        // and even elements
        while (i < size_odd)
        {
            document.write(odd[i] + " ");
            ++i;
        }
        while (j < size_even)
        {
            document.write(even[j] + " ");
        }
    }
}
 
 
// Driver Code
 
    let arr = [ 6, 7, 9, 8, 10, 11 ];
    let N = arr.length;
   
    printPermutation(arr, N);
      
</script>
Producción

7 6 9 8 11 10 

Complejidad temporal: O(N) donde N es el número de elementos. Se requiere tiempo O(N) para atravesar la array dada y formar los vectores pares e impares y se requiere O(N) para imprimir la permutación.
Espacio Auxiliar: O(N) porque los elementos dados del arreglo están distribuidos entre los dos vectores.

Publicación traducida automáticamente

Artículo escrito por sri_srajit y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *