Dada cualquier sucesión , encuentre el mayor desajuste de .
Un trastorno es cualquier permutación de , tal que no hay dos elementos en la misma posición en y que sean iguales.
El trastorno más grande es tal que .
Ejemplos:
Input : seq[] = {5, 4, 3, 2, 1} Output : 4 5 2 1 3 Input : seq[] = {56, 21, 42, 67, 23, 74} Output : 74, 67, 56, 42, 21, 23
Dado que estamos interesados en generar el mayor trastorno, comenzamos a colocar elementos más grandes en posiciones más significativas.
Comience desde la izquierda, en cualquier posición, coloque el siguiente elemento más grande entre los valores de la secuencia que aún no se han colocado en las posiciones anteriores .
Para escanear todas las posiciones se necesita N iteración. En cada iteración, debemos encontrar un número máximo, por lo que una implementación trivial sería compleja.
Sin embargo, si usamos una estructura de datos como max-heap para encontrar el elemento máximo, entonces la complejidad se reduce a
A continuación se muestra la implementación.
C++
// C++ program to find the largest derangement #include <bits/stdc++.h> using namespace std; void printLargest(int seq[], int N) { int res[N]; // Stores result // Insert all elements into a priority queue std::priority_queue<int> pq; for (int i = 0; i < N; i++) pq.push(seq[i]); // Fill Up res[] from left to right for (int i = 0; i < N; i++) { int d = pq.top(); pq.pop(); if (d != seq[i] || i == N - 1) { res[i] = d; } else { // New Element popped equals the element // in original sequence. Get the next // largest element res[i] = pq.top(); pq.pop(); pq.push(d); } } // If given sequence is in descending order then // we need to swap last two elements again if (res[N - 1] == seq[N - 1]) { res[N - 1] = res[N - 2]; res[N - 2] = seq[N - 1]; } printf("\nLargest Derangement \n"); for (int i = 0; i < N; i++) printf("%d ", res[i]); } // Driver code int main() { int seq[] = { 92, 3, 52, 13, 2, 31, 1 }; int n = sizeof(seq)/sizeof(seq[0]); printLargest(seq, n); return 0; }
Java
// Java program to find the largest derangement import java.io.*; import java.util.Collections; import java.util.PriorityQueue; class GFG{ public static void printLargest(int a[],int n) { PriorityQueue<Integer> pq = new PriorityQueue<>( Collections.reverseOrder()); // Insert all elements into a priority queue for(int i = 0; i < n; i++) { pq.add(a[i]); } // Stores result int res[] = new int[n]; // Fill Up res[] from left to right for(int i = 0; i < n; i++) { int p = pq.peek(); pq.remove(); if (p != a[i] || i == n - 1) { res[i] = p; } else { // New Element popped equals the element // in original sequence. Get the next // largest element res[i] = pq.peek(); pq.remove(); pq.add(p); } } // If given sequence is in descending // order then we need to swap last two // elements again if (res[n - 1] == a[n - 1]) { res[n - 1] = res[n - 2]; res[n - 2] = a[n - 1]; } System.out.println("Largest Derangement"); for(int i = 0; i < n; i++) { System.out.print(res[i] + " "); } } // Driver code public static void main(String[] args) { int n = 7; int seq[] = { 92, 3, 52, 13, 2, 31, 1 }; printLargest(seq, n); } } // This code is contributed by aditya7409
Python3
# Python3 program to find the largest derangement def printLargest(seq, N) : res = [0]*N # Stores result # Insert all elements into a priority queue pq = [] for i in range(N) : pq.append(seq[i]) # Fill Up res[] from left to right for i in range(N) : pq.sort() pq.reverse() d = pq[0] del pq[0] if (d != seq[i] or i == N - 1) : res[i] = d else : # New Element popped equals the element # in original sequence. Get the next # largest element res[i] = pq[0] del pq[0] pq.append(d) # If given sequence is in descending order then # we need to swap last two elements again if (res[N - 1] == seq[N - 1]) : res[N - 1] = res[N - 2] res[N - 2] = seq[N - 1] print("Largest Derangement") for i in range(N) : print(res[i], end = " ") # Driver code seq = [ 92, 3, 52, 13, 2, 31, 1 ] n = len(seq) printLargest(seq, n) # This code is contributed by divyesh072019.
C#
// C# program to find the largest derangement using System; using System.Collections.Generic; class GFG { static void printLargest(int[] seq, int N) { int[] res = new int[N]; // Stores result // Insert all elements into a priority queue List<int> pq = new List<int>(); for (int i = 0; i < N; i++) pq.Add(seq[i]); // Fill Up res[] from left to right for (int i = 0; i < N; i++) { pq.Sort(); pq.Reverse(); int d = pq[0]; pq.RemoveAt(0); if (d != seq[i] || i == N - 1) { res[i] = d; } else { // New Element popped equals the element // in original sequence. Get the next // largest element res[i] = pq[0]; pq.RemoveAt(0); pq.Add(d); } } // If given sequence is in descending order then // we need to swap last two elements again if (res[N - 1] == seq[N - 1]) { res[N - 1] = res[N - 2]; res[N - 2] = seq[N - 1]; } Console.WriteLine("Largest Derangement"); for (int i = 0; i < N; i++) Console.Write(res[i] + " "); } // Driver code static void Main() { int[] seq = { 92, 3, 52, 13, 2, 31, 1 }; int n = seq.Length; printLargest(seq, n); } } // This code is contributed by divyeshrabadiya07
Javascript
<script> // JavaScript program to find the largest derangement function printLargest(seq, N) { let res = new Array(N); // Stores result // Insert all elements into a priority queue let pq = new Array(); for (let i = 0; i < N; i++) pq.push(seq[i]); // Fill Up res[] from left to right for (let i = 0; i < N; i++) { pq.sort((a, b) => a - b); pq.reverse(); let d = pq[0]; pq.shift(); if (d != seq[i] || i == N - 1) { res[i] = d; } else { // New Element popped equals the element // in original sequence. Get the next // largest element res[i] = pq[0]; pq.shift(); pq.push(d); } } // If given sequence is in descending order then // we need to swap last two elements again if (res[N - 1] == seq[N - 1]) { res[N - 1] = res[N - 2]; res[N - 2] = seq[N - 1]; } document.write("Largest Derangement<br>"); for (let i = 0; i < N; i++) document.write(res[i] + " "); } // Driver code let seq = [92, 3, 52, 13, 2, 31, 1]; let n = seq.length; printLargest(seq, n); // This code is contributed by gfgking </script>
Largest Derangement 52 92 31 3 13 1 2
Complejidad de tiempo: O(n log n)
Nota:
El método se puede modificar fácilmente para obtener también el trastorno más pequeño.
En lugar de Max Heap , deberíamos usar Min Heap para obtener elementos mínimos de forma consecutiva .
Este artículo es una contribución de Sayan Mahapatra . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA