Último elemento restante eliminando dos elementos más grandes y reemplazando por su diferencia absoluta si son desiguales

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:
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: 

  1. Inserte todos los elementos de la array en la cola de prioridad.
  2. 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.
  3. 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.
  4. Si el montón tiene solo un elemento, imprima ese elemento.
  5. 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>
Producción: 

1

 

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

Publicación traducida automáticamente

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