Dada una array arr[] de N elementos, la tarea es realizar la siguiente operación:
- Elija los dos elementos más grandes de la array y elimine estos elementos. Si los elementos son desiguales, inserte la diferencia absoluta de los elementos en la array.
- Realice las operaciones anteriores hasta que la array tenga 1 o ningún elemento. Si a la array solo le queda un elemento, imprima ese elemento; de lo contrario, imprima «-1».
Ejemplos:
Entrada: arr[] = { 3, 5, 2, 7 }
Salida: 1
Explicación:
Los dos elementos más grandes son 7 y 5. Deséchelos. Dado que ambos no son iguales, inserte 7 – 5 = 2 en la array. Por lo tanto, arr[] = { 3, 2, 2 }
Los dos elementos más grandes son 3 y 2. Descártalos. Dado que ambos no son iguales, inserte 3 – 2 = 1 en la array. Por lo tanto, arr[] = { 1, 2 }
Los dos elementos más grandes son 2 y 1. Deséchelos. Dado que ambos no son iguales, inserte 2 – 1 = 1 en la array. Por lo tanto, arr[] = { 1 }
El único elemento que queda es 1. Imprime el valor del único elemento que queda.Entrada: arr[] = { 3, 3 }
Salida: -1
Explicación:
Los dos elementos más grandes son 3 y 3. Deséchelos. Ahora la array no tiene elementos. Entonces, imprime -1.
Enfoque: para resolver el problema anterior, utilizaremos la estructura de datos de la cola de prioridad . A continuación se muestran los pasos:
- Inserte todos los elementos de la array en la cola de prioridad.
- Como cola de prioridad se basa en la implementación de Max-Heap . Por lo tanto, la eliminación del elemento da el elemento máximo.
- Hasta que el tamaño de la cola de prioridad no sea inferior a 2, elimine dos elementos (por ejemplo, X e Y ) y haga lo siguiente:
- Si X e Y no son iguales, inserte el valor absoluto de X e Y en la cola de prioridad.
- De lo contrario, vuelva al paso 3.
- Si el montón tiene solo un elemento, imprima ese elemento.
- De lo contrario, escriba «-1».
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 print the remaining element int final_element(int arr[], int n) { // Priority queue can be used // to construct max-heap priority_queue<int> heap; // Insert all element of arr[] // into priority queue for (int i = 0; i < n; i++) heap.push(arr[i]); // Perform operation until heap // size becomes 0 or 1 while (heap.size() > 1) { // Remove largest element int X = heap.top(); heap.pop(); // Remove 2nd largest element int Y = heap.top(); heap.pop(); // If extracted element // are not equal if (X != Y) { // Find X - Y and push // it to heap int diff = abs(X - Y); heap.push(diff); } } // If heap size is 1, then // print the remaining element if (heap.size() == 1) { cout << heap.top(); } // Else print "-1" else { cout << "-1"; } } // Driver Code int main() { // Given array arr[] int arr[] = { 3, 5, 2, 7 }; // Size of array arr[] int n = sizeof(arr) / sizeof(arr[0]); // Function Call final_element(arr, n); return 0; }
Java
// Java program for the above approach import java.io.*; import java.util.Collections; import java.util.*; class GFG{ // Function to print the remaining element static public int final_element(Integer[] arr, int n) { if(arr == null) { return 0; } // Priority queue can be used // to construct max-heap PriorityQueue<Integer> heap = new PriorityQueue<Integer>(Collections.reverseOrder()); // Insert all element of arr[] // into priority queue for(int i = 0; i < n; i++) { heap.offer(arr[i]); } // Perform operation until heap // size becomes 0 or 1 while (heap.size() > 1) { // Remove largest element int X = heap.poll(); // Remove 2nd largest element int Y = heap.poll(); // If extracted element // are not equal if (X != Y) { // Find X - Y and push // it to heap int diff = Math.abs(X - Y); heap.offer(diff); } } // If heap size is 1, then // print the remaining element // Else print "-1" return heap.size() == 1 ? heap.poll() : -1; } // Driver code public static void main (String[] args) { // Given array arr[] Integer arr[] = new Integer[] { 3, 5, 2, 7}; // Size of array arr[] int n = arr.length; // Function Call System.out.println(final_element(arr, n)); } } // This code is contributed by deepika_sharma
Python3
# Python3 program for the above approach from queue import PriorityQueue # Function to print the remaining element def final_element(arr, n): # Priority queue can be used # to construct max-heap heap = PriorityQueue() # Insert all element of # arr[] into priority queue. # Default priority queue in Python # is min-heap so use -1*arr[i] for i in range(n): heap.put(-1 * arr[i]) # Perform operation until heap # size becomes 0 or 1 while (heap.qsize() > 1): # Remove largest element X = -1 * heap.get() # Remove 2nd largest element Y = -1 * heap.get() # If extracted elements # are not equal if (X != Y): # Find X - Y and push # it to heap diff = abs(X - Y) heap.put(-1 * diff) # If heap size is 1, then # print the remaining element if (heap.qsize() == 1): print(-1 * heap.get()) # Else print "-1" else: print("-1") # Driver Code if __name__ == '__main__': # Given array arr[] arr = [ 3, 5, 2, 7 ] # Size of array arr[] n = len(arr) # Function call final_element(arr, n) # This code is contributed by himanshu77
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG{ // Function to print the remaining element static void final_element(int[] arr, int n) { // Priority queue can be used // to construct max-heap List<int> heap = new List<int>(); // Insert all element of arr[] // into priority queue for(int i = 0; i < n; i++) heap.Add(arr[i]); // Perform operation until heap // size becomes 0 or 1 while (heap.Count > 1) { // Remove largest element heap.Sort(); heap.Reverse(); int X = heap[0]; heap.RemoveAt(0); // Remove 2nd largest element int Y = heap[0]; heap.RemoveAt(0); // If extracted element // are not equal if (X != Y) { // Find X - Y and push // it to heap int diff = Math.Abs(X - Y); heap.Add(diff); } } // If heap size is 1, then // print the remaining element if (heap.Count == 1) { heap.Sort(); heap.Reverse(); Console.Write(heap[0]); } // Else print "-1" else { Console.Write(-1); } } // Driver code static void Main() { // Given array arr[] int[] arr = { 3, 5, 2, 7 }; // Size of array arr[] int n = arr.Length; // Function Call final_element(arr, n); } } // This code is contributed by divyeshrabadiya07
Javascript
<script> // Javascript program for the above approach // Function to print the remaining element function final_element(arr, n) { // Priority queue can be used // to construct max-heap var heap = []; // Insert all element of arr[] // into priority queue for (var i = 0; i < n; i++) heap.push(arr[i]); heap.sort((a,b)=>a-b); // Perform operation until heap // size becomes 0 or 1 while (heap.length > 1) { // Remove largest element var X = heap[heap.length-1]; heap.pop(); // Remove 2nd largest element var Y = heap[heap.length-1]; heap.pop(); // If extracted element // are not equal if (X != Y) { // Find X - Y and push // it to heap var diff = Math.abs(X - Y); heap.push(diff); } heap.sort((a,b)=>a-b); } // If heap size is 1, then // print the remaining element if (heap.length == 1) { document.write(heap[heap.length-1]); } // Else print "-1" else { document.write("-1"); } } // Driver Code // Given array arr[] var arr = [3, 5, 2, 7 ]; // Size of array arr[] var n = arr.length; // Function Call final_element(arr, n); // This code is contributed by rutvik_56. </script>
1
Complejidad de tiempo: O(N*log(N))
Complejidad de espacio auxiliar: O(N)