Encuentre la permutación de [1, N] tal que (arr[i] != i+1) y la suma de la diferencia absoluta entre arr[i] y (i+1) sea mínima

Dado un entero positivo N , la tarea es encontrar la permutación de los primeros N números naturales , digamos arr[] tal que (arr[i] != i + 1) y la suma de la diferencia absoluta entre arr[i] y (i + 1) es mínimo .

Ejemplos:

Entrada: N = 4
Salida: 2 1 4 3
Explicación:
Considere la permutación {2, 1, 4, 3}, ahora, la suma es abs (2 – 1) + abs (1 – 2) + abs (4 – 3) ) + abs(3 – 4) = 1 + 1 + 1 + 1 = 4, que es el mínimo.

Entrada: N = 7
Salida: 2 1 4 3 6 7 5

Enfoque ingenuo: el enfoque más simple para resolver el problema dado es generar todas las permutaciones posibles de los primeros N números naturales e imprimir esa permutación que satisface los criterios dados.

Complejidad temporal: O(N!)
Espacio auxiliar: O(1)

Enfoque eficiente: el enfoque anterior también se puede optimizar observando el hecho de que la array resultante se puede formar intercambiando pares adyacentes alternos para permitir la nueva posición con la suma mínima de la diferencia absoluta entre arr[i] y (i + 1) . En caso de que N sea mayor que 1 y N sea impar, el último elemento puede intercambiarse por cualquiera de los penúltimos o antepenúltimos elementos de la permutación. Siga los pasos a continuación para resolver el problema dado:

  • Inicialice una array, digamos arr[] con el primer N número natural dispuesto en orden ascendente.
  • Atraviese la array e intercambie todos los elementos adyacentes como swap ( arr[i], arr[i – 1]) .
  • Ahora, si el valor de N es mayor que 1 y N es impar, entonces swap(arr[N – 1], arr[N – 2]) .
  • Después de completar los pasos anteriores, imprima la array arr[] como la permutación resultante.

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

C++

// C++ program for the above approach
 
// Function to generate the permutation
// of the first N natural numbers having
// sum of absolute difference between
// element and indices as minimum
#include <iostream>
using namespace std;
 
void swap(int& a, int& b)
{
    int temp = a;
    a = b;
    b = temp;
}
 
void findPermutation(int N)
{
   
    // Initialize array arr[] from 1 to N
    int arr[N];
    for (int i = 0; i < N; i++) {
        arr[i] = i + 1;
    }
    for (int i = 1; i < N; i += 2) {
       
      // Swap alternate positions
        swap(arr[i], arr[i - 1]);
    }
   
  // Check N is greater than 1 and
    // N is odd
    if (N % 2 == 1 && N > 1) {
       
      // Swapping last two positions
        swap(arr[N - 1], arr[N - 2]);
    }
 
   // Print the permutation
    for (int i = 0; i < N; i++) {
        cout << arr[i] << " ";
    }
}
 
// Driver code
int main()
{
    int N = 7;
    findPermutation(N);
    return 0;
}
 
// This code is contributed by Parth Manchanda

Java

// Java program for the above approach
 
// Function to generate the permutation
// of the first N natural numbers having
// sum of absolute difference between
// element and indices as minimum
import java.util.*;
 
class GFG{
 
static void findPermutation(int N)
{
     
    // Initialize array arr[] from 1 to N
    int[] arr = new int[N];
    int temp;
     
    for(int i = 0; i < N; i++)
    {
        arr[i] = i + 1;
    }
    for(int i = 1; i < N; i += 2)
    {
         
        // Swap alternate positions
        temp = arr[i];
        arr[i] = arr[i - 1];
        arr[i - 1] = temp;
    }
 
    // Check N is greater than 1 and
    // N is odd
    if (N % 2 == 1 && N > 1)
    {
         
        // Swapping last two positions
        temp = arr[N - 1];
        arr[N - 1] = arr[N - 2];
        arr[N - 2] = temp;
    }
 
    // Print the permutation
    for(int i = 0; i < N; i++)
    {
        System.out.print(arr[i] + " ");
    }
}
 
// Driver code
public static void main(String[] args)
{
    int N = 7;
     
    findPermutation(N);
}
}
 
// This code is contributed by subhammahato348

Python3

# Python3 program for the above approach
 
# Function to generate the permutation
# of the first N natural numbers having
# sum of absolute difference between
# element and indices as minimum
def findPermutation(N):
 
    # Initialize array arr[] from 1 to N
    arr = [i + 1 for i in range(N)]
 
    # Swap alternate positions
    for i in range(1, N, 2):
        arr[i], arr[i-1] = arr[i-1], arr[i]
 
    # Check N is greater than 1 and
    # N is odd
    if N % 2 and N > 1:
 
        # Swapping last two positions
        arr[-1], arr[-2] = arr[-2], arr[-1]
 
    # Print the permutation
    for i in arr:
        print(i, end = " ")
 
 
# Driver Code
if __name__ == '__main__':
 
    N = 7
    findPermutation(N)

C#

// C# program for the above approach
 
// Function to generate the permutation
// of the first N natural numbers having
// sum of absolute difference between
// element and indices as minimum
using System;
class GFG {
 
    static void findPermutation(int N)
    {
 
        // Initialize array arr[] from 1 to N
        int[] arr = new int[N];
        int temp;
        for (int i = 0; i < N; i++) {
            arr[i] = i + 1;
        }
        for (int i = 1; i < N; i += 2) {
 
            // Swap alternate positions
            temp = arr[i];
            arr[i] = arr[i - 1];
            arr[i - 1] = temp;
        }
 
        // Check N is greater than 1 and
        // N is odd
        if (N % 2 == 1 && N > 1) {
 
            // Swapping last two positions
            temp = arr[N - 1];
            arr[N - 1] = arr[N - 2];
            arr[N - 2] = temp;
        }
 
        // Print the permutation
        for (int i = 0; i < N; i++) {
            Console.Write(arr[i] + " ");
        }
    }
 
    // Driver code
    public static void Main()
    {
        int N = 7;
        findPermutation(N);
    }
}
 
// This code is contributed by ukasp.

Javascript

<script>
 
// Javascript program for the above approach
 
// Function to generate the permutation
// of the first N natural numbers having
// sum of absolute difference between
// element and indices as minimum
function findPermutation(N)
{
    var i;
     
    // Initialize array arr[] from 1 to N
    var arr = new Array(N);
    for(i = 0; i < N; i++)
    {
        arr[i] = i + 1;
    }
 
    for(i = 1; i < N; i += 2)
    {
         
        // Swap alternate positions
        var temp = arr[i];
        arr[i] = arr[i - 1];
        arr[i - 1] = temp;
    }
   
    // Check N is greater than 1 and
    // N is odd
    if (N % 2 == 1 && N > 1)
    {
         
        // Swapping last two positions
        var temp = arr[N - 1];
        arr[N - 1] = arr[N - 2];
        arr[N - 2] = temp;
    }
     
    // Print the permutation
    for(i = 0; i < N; i++)
    {
        document.write(arr[i] + " ");
    }
}
 
// Driver code
var N = 7;
 
findPermutation(N);
 
// This code is contributed by SURENDRA_GANGWAR
 
</script>
Producción: 

2 1 4 3 6 7 5

 

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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