Permutación lexicográficamente más pequeña que tiene la suma máxima de diferencias entre elementos adyacentes

Dada una array arr[] de tamaño N , la tarea es encontrar la permutación lexicográficamente más pequeña de la array dada de modo que la suma de la diferencia entre elementos adyacentes sea máxima.

Ejemplos:

Entrada: arr[] = {1, 2, 3, 4, 5}
Salida: 5 2 3 4 1
Explicación:
Suma de la diferencia entre elementos adyacentes = (5 – 2) + (2 – 3) + (3 – 4) + (4 – 1) = 4.
{5, 2, 3, 4, 1} es lexicográficamente la array más pequeña y 4 es la suma máxima posible.

Entrada: arr[] = {3, 4, 1}
Salida: 4 3 1
Explicación:
Suma de la diferencia entre elementos adyacentes = (4 – 3) + (3 – 1) = 3
{4, 3, 1} es la permutación lexicográficamente más pequeña posible de los elementos de la array. La suma máxima posible de elementos adyacentes es 3.

Enfoque ingenuo: el enfoque más simple es generar todas las permutaciones de la array dada y encontrar la suma de cada permutación mientras se realiza un seguimiento de la suma máxima obtenida. Al final, imprima la permutación lexicográficamente más pequeña con la suma máxima. 

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

Enfoque eficiente: el enfoque anterior se puede optimizar en función de la siguiente observación:

Sea la permutación requerida del arreglo {p 1 , p 2 , p 3 , …, p N – 2 , p N – 1, p N }. 
Suma de la diferencia de los elementos adyacentes, S = (p 1 -p 2 ) + (p 2 -p 3 ) +….+ (p N – 2 – p N – 1 ) + (p N – 1 – p N )
                                                                             = pag 1 – pag norte

Para maximizar S , p 1 debe ser el elemento más grande y p N debe ser el elemento más pequeño en la array dada arr[] . Para construir lexicográficamente la permutación más pequeña, ordene el resto de los elementos en orden creciente. Siga los pasos a continuación para resolver el problema:

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

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the lexicographically
// smallest permutation of an array such
// that the sum of the difference between
// adjacent elements is maximum
void maximumSumPermutation(vector<int>& arr)
{
 
    // Stores the size of the array
    int N = arr.size();
 
    // Sort the given array in
    // increasing order
    sort(arr.begin(), arr.end());
 
    // Swap the first and last array elements
    swap(arr[0], arr[N - 1]);
 
    // Print the required permutation
    for (int i : arr) {
 
        cout << i << " ";
    }
}
 
// Driver Code
int main()
{
    vector<int> arr = { 1, 2, 3, 4, 5 };
    maximumSumPermutation(arr);
 
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG
{
 
    // Function to find the lexicographically
    // smallest permutation of an array such
    // that the sum of the difference between
    // adjacent elements is maximum
    static void maximumSumPermutation(int[] arr)
    {
 
        // Stores the size of the array
        int N = arr.length;
 
        // Sort the given array in
        // increasing order
        Arrays.sort(arr);
 
        // Swap the first and last array elements
          int temp = arr[0];
          arr[0] = arr[N - 1];
        arr[N - 1] = temp;
 
        // Print the required permutation
        for (int i : arr) {
 
            System.out.print(i + " ");
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int arr[] = { 1, 2, 3, 4, 5 };
        maximumSumPermutation(arr);
    }
}
 
// This code is contributed by Dharanendra L V.

Python3

# Python program for the above approach
 
# Function to find the lexicographically
# smallest permutation of an array such
# that the sum of the difference between
# adjacent elements is maximum
def maximumSumPermutation(arr):
   
    # Stores the size of the array
    N = len(arr);
 
    # Sort the given array in
    # increasing order
    arr.sort();
 
    # Swap the first and last array elements
    temp = arr[0];
    arr[0] = arr[N - 1];
    arr[N - 1] = temp;
 
    # Print the required permutation
    for i in arr:
        print(i, end = " ");
 
# Driver Code
if __name__ == '__main__':
    arr = [1, 2, 3, 4, 5];
    maximumSumPermutation(arr);
 
# This code is contributed by 29AjayKumar

C#

// C# program to implement
// the above approach
using System;
class GFG{
 
  // Function to find the lexicographically
  // smallest permutation of an array such
  // that the sum of the difference between
  // adjacent elements is maximum
  static void maximumSumPermutation(int[] arr)
  {
 
    // Stores the size of the array
    int N = arr.Length;
 
    // Sort the given array in
    // increasing order
    Array.Sort(arr);
 
    // Swap the first and last array elements
    int temp = arr[0];
    arr[0] = arr[N - 1];
    arr[N - 1] = temp;
 
    // Print the required permutation
    foreach (int i in arr)
    {
      Console.Write(i + " ");
    }
  }
 
 
  // Driver Code
  public static void Main(String[] args)
  {
    int[] arr = { 1, 2, 3, 4, 5 };
    maximumSumPermutation(arr);
  }
}
 
// This code is contributed by sanjoy_62.

Javascript

<script>
// javascript program for the above approach
 
// Function to find the lexicographically
// smallest permutation of an array such
// that the sum of the difference between
// adjacent elements is maximum
function maximumSumPermutation(arr)
{
 
    // Stores the size of the array
    var N = arr.length;
    // Sort the given array in
    // increasing order
    arr.sort((a,b)=>a-b);
    // Swap the first and last array elements
      var temp = arr[0];
      arr[0] = arr[N - 1];
      arr[N - 1] = temp;
 
    // Print the required permutation
    document.write(arr);
}
 
// Driver Code
var arr = [ 1, 2, 3, 4, 5 ];
maximumSumPermutation(arr);
 
// This code is contributed by 29AjayKumar
</script>
Producción: 

5 2 3 4 1

 

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

Publicación traducida automáticamente

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