Recuento mínimo de elementos requeridos para obtener la array dada mediante operaciones de espejo repetidas

Dada una array arr[] que consta de N enteros, la tarea es encontrar la array K[] de longitud mínima posible de modo que después de realizar múltiples operaciones de espejo en K[] , se pueda obtener la array arr[] dada.
 

Operación de espejo: agregar todos los elementos de la array a la array original en orden inverso. 
Ilustración: 
arr[] = {1, 2, 3} 
Después de la primera operación de espejo, arr[] se modifica a {1, 2, 3, 3, 2, 1} 
Después de la segunda operación de espejo, arr[] se modifica a {1 , 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1} 
 

Ejemplos: 
 

Entrada: N = 6, arr[] = { 1, 2, 3, 3, 2, 1 } 
Salida:
Explicación: 
Los subarreglos {1, 2, 3} y {3, 2, 1} son imágenes especulares entre sí . 
La operación de espejo único en {1, 2, 3} obtiene la array dada. 
Por lo tanto, el número mínimo de elementos necesarios es 3.
Entrada: N = 8, arr[] = { 1, 2, 2, 1, 1, 2, 2, 1 } 
Salida:
Explicación: 
Subarreglos {1, 2, 2 , 1} y {1, 2, 2, 1} son imágenes especulares entre sí. 
El subarreglo {1, 2} y {2, 1} son imágenes especulares entre sí. 
{1, 2} -> {1, 2, 2, 1} -> {1, 2, 2, 1, 1, 2, 2, 1} 
Por lo tanto, el número mínimo de elementos necesarios es 2. 
 

Enfoque ingenuo: 
el enfoque más simple para resolver el problema es generar todos los subarreglos posibles a partir del arreglo dado de tamaño menor que igual a N/2 y, para cada subarreglo, verificar si al realizar la operación espejo se obtiene el arreglo arr[] o no. Imprime el subarreglo de longitud mínima que cumple la condición. Si no se encuentra ningún subarreglo satisfactorio, imprima No
Complejidad de tiempo: O(N 3
Espacio auxiliar: O(N)
Enfoque eficiente: 
El enfoque anterior se puede optimizar aún más utilizando la técnica Divide and Conquer . Siga los pasos a continuación para resolver el problema: 
 

  • Inicialice una variable K = N y luego verifique si el prefijo de A[] de longitud K es un palíndromo o no.
  • Si el prefijo de longitud K es un palíndromo, divida K por 2 y realice la verificación anterior.
  • Si el prefijo no es un palíndromo, la respuesta es el valor actual de K.
  • Siga comprobando mientras K > 0 hasta que K sea impar.
  • Si K es impar , imprima el valor actual de K.

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

C++

// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find minimum number
// of elements required to form A[]
// by performing mirroring operation
int minimumrequired(int A[], int N)
{
    // Initialize K
    int K = N;
 
    int ans;
 
    while (K > 0) {
 
        // Odd length array
        // cannot be formed by
        // mirror operation
        if (K % 2 == 1) {
            ans = K;
            break;
        }
 
        bool ispalindrome = 1;
 
        // Check if prefix of
        // length K is palindrome
        for (int i = 0; i < K / 2; i++) {
 
            // Check if not a palindrome
            if (A[i] != A[K - 1 - i])
 
                ispalindrome = 0;
        }
 
        // If found to be palindrome
        if (ispalindrome) {
            ans = K / 2;
            K /= 2;
        }
 
        // Otherwise
        else {
            ans = K;
            break;
        }
    }
 
    // Return the final answer
    return ans;
}
 
// Driver Code
int main()
{
    int a[] = { 1, 2, 2, 1, 1, 2, 2, 1 };
    int N = sizeof a / sizeof a[0];
 
    cout << minimumrequired(a, N);
    return 0;
}

Java

// Java Program to implement
// the above approach
class GFG{
   
// Function to find minimum number
// of elements required to form A[]
// by performing mirroring operation
static int minimumrequired(int A[], int N)
{
    // Initialize K
    int K = N;
  
    int ans=0;
  
    while (K > 0)
    {
  
        // Odd length array
        // cannot be formed by
        // mirror operation
        if (K % 2 == 1)
        {
            ans = K;
            break;
        }
  
        int ispalindrome = 1;
  
        // Check if prefix of
        // length K is palindrome
        for (int i = 0; i < K / 2; i++)
        {
  
            // Check if not a palindrome
            if (A[i] != A[K - 1 - i])
  
                ispalindrome = 0;
        }
  
        // If found to be palindrome
        if (ispalindrome == 1)
        {
            ans = K / 2;
            K /= 2;
        }
  
        // Otherwise
        else
        {
            ans = K;
            break;
        }
    }
  
    // Return the final answer
    return ans;
}
  
// Driver Code
public static void main(String[] args)
{
    int a[] = { 1, 2, 2, 1, 1, 2, 2, 1 };
    int N = a.length;
  
    System.out.println(minimumrequired(a, N));
}
}
 
// This code is contributed by rock_cool

Python3

# Python3 program to implement
# the above approach
 
# Function to find minimum number
# of elements required to form A[]
# by performing mirroring operation
def minimumrequired(A, N):
     
    # Initialize K
    K = N
     
    while (K > 0):
         
        # Odd length array
        # cannot be formed by
        # mirror operation
        if (K % 2) == 1:
            ans = K
            break
         
        ispalindrome = 1
         
        # Check if prefix of
        # length K is palindrome
        for i in range(0, K // 2):
             
            # Check if not a palindrome
            if (A[i] != A[K - 1 - i]):
                ispalindrome = 0
                 
        # If found to be palindrome
        if (ispalindrome == 1):
            ans = K // 2
            K = K // 2
             
        # Otherwise
        else:
            ans = K
            break
     
    # Return the final answer
    return ans
 
# Driver code
A = [ 1, 2, 2, 1, 1, 2, 2, 1 ]
N = len(A)
 
print(minimumrequired(A, N))
         
# This code is contributed by VirusBuddah_

C#

// C# program to implement
// the above approach
using System;
 
class GFG{
 
// Function to find minimum number
// of elements required to form []A
// by performing mirroring operation
static int minimumrequired(int[] A, int N)
{
     
    // Initialize K
    int K = N;
 
    int ans = 0;
 
    while (K > 0)
    {
 
        // Odd length array
        // cannot be formed by
        // mirror operation
        if (K % 2 == 1)
        {
            ans = K;
            break;
        }
 
        int ispalindrome = 1;
 
        // Check if prefix of
        // length K is palindrome
        for(int i = 0; i < K / 2; i++)
        {
 
            // Check if not a palindrome
            if (A[i] != A[K - 1 - i])
                ispalindrome = 0;
        }
 
        // If found to be palindrome
        if (ispalindrome == 1)
        {
            ans = K / 2;
            K /= 2;
        }
 
        // Otherwise
        else
        {
            ans = K;
            break;
        }
    }
 
    // Return the readonly answer
    return ans;
}
 
// Driver Code
public static void Main(String[] args)
{
    int[] a = { 1, 2, 2, 1, 1, 2, 2, 1 };
    int N = a.Length;
 
    Console.WriteLine(minimumrequired(a, N));
}
}
 
// This code is contributed by amal kumar choubey

Javascript

<script>
    // Javascript Program to implement
    // the above approach
     
    // Function to find minimum number
    // of elements required to form A[]
    // by performing mirroring operation
    function minimumrequired(A, N)
    {
        // Initialize K
        let K = N;
 
        let ans;
 
        while (K > 0) {
 
            // Odd length array
            // cannot be formed by
            // mirror operation
            if (K % 2 == 1) {
                ans = K;
                break;
            }
 
            let ispalindrome = true;
 
            // Check if prefix of
            // length K is palindrome
            for (let i = 0; i < parseInt(K / 2, 10); i++) {
 
                // Check if not a palindrome
                if (A[i] != A[K - 1 - i])
 
                    ispalindrome = false;
            }
 
            // If found to be palindrome
            if (ispalindrome) {
                ans = parseInt(K / 2, 10);
                K = parseInt(K / 2, 10);
            }
 
            // Otherwise
            else {
                ans = K;
                break;
            }
        }
 
        // Return the final answer
        return ans;
    }
 
    let a = [ 1, 2, 2, 1, 1, 2, 2, 1 ];
    let N = a.length;
   
    document.write(minimumrequired(a, N));
     
    // This code is contributed by divyeshrabadiya07.
</script>
Producción: 

2

 

Complejidad de tiempo: O(N*log N) 
Espacio auxiliar: O(N)
 

Publicación traducida automáticamente

Artículo escrito por nishitsharma1 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 *