Elemento mayor más pequeño en el lado derecho

3 Dada una serie de elementos distintos, imprima el elemento mayor más cercano para cada elemento. El elemento mayor más cercano a un elemento x es el elemento más pequeño del lado derecho de x en la array que es mayor que x. Elementos para los que no existe un elemento mayor, considere el siguiente elemento mayor como -1. 
Ejemplos: 
 

Input: arr[] = {4, 5, 2, 25}
Output: 
Element       NGE
   4      -->   5
   5      -->   25
   2      -->   25
   25     -->   -1

Input: arr[] = {4, 10, 7}
Output: 
Element       NGE
   4       -->  7
   10      -->   -1
   7       -->   -1

Enfoque: en esta publicación, discutiremos cómo encontrar el siguiente elemento mayor usando C++ STL( set ). 
Encontrar el elemento mayor más pequeño en el lado derecho será como encontrar el primer elemento mayor del elemento actual en una lista ordenada. 
Considere el ejemplo 1, la lista ordenada se vería como 2, 4, 5, 25. 
Aquí, para el elemento 4, el elemento mayor es 5 ya que está junto a él, por lo que imprimimos 5 y eliminamos 4 porque no sería mayor que el otros elementos ya que ya no está a la derecha de nadie. 
Del mismo modo, para 5 es 25 y eliminamos 5 de la lista, ya que 5 no estará a la derecha de 2 o 25, por lo que se puede eliminar.
A continuación se detallan los pasos para encontrar el siguiente elemento mayor de cada elemento del índice. 
 

  • Inserte todos los elementos en un Conjunto , almacenará todos los elementos en orden creciente.
  • Iterar en la array de elementos y, para cada índice, encontrar el límite superior del elemento de índice actual. upper_bound() devuelve un iterador que puede apuntar a la siguiente posición. 
    1. Si el iterador apunta a una posición más allá del último elemento, entonces no existe NGE para el elemento de índice actual.
    2. Si el iterador apunta a una posición que hace referencia a un elemento, ese elemento es el NGE del elemento de índice actual.
  • Encuentre la posición del elemento de índice actual en cada recorrido y elimínelo del conjunto usando las funciones >lower_bound() y erase() del conjunto.

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

C++

// C++ program to print the
// NGE's of array elements using
// C++ STL
#include <bits/stdc++.h>
using namespace std;
 
// Function to print the NGE
void printNGE(int a[], int n)
{
 
    set<int> ms;
 
    // insert in the multiset container
    for (int i = 0; i < n; i++)
        ms.insert(a[i]);
 
    cout << "Element "
        << "NGE";
 
    // traverse for all array elements
    for (int i = 0; i < n; i++) {
 
        // find the upper_bound in set
        auto it = ms.upper_bound(a[i]);
 
        // if points to the end, then
        // no NGE of that element
        if (it == ms.end()) {
            cout << "\n " << a[i]
                << " ----> " << -1;
        }
 
        // print the element at that position
        else {
            cout << "\n " << a[i]
                << " ----> " << *it;
        }
 
        // find the first occurrence of
        // the index element and delete it
        it = ms.lower_bound(a[i]);
 
        // delete one occurrence
        // from the container
        ms.erase(it);
    }
}
 
// Driver Code
int main()
{
    int a[] = { 4, 5, 2, 25 };
    int n = sizeof(a) / sizeof(a[0]);
 
    // Function call to print the NGE
    printNGE(a, n);
    return 0;
}

Java

// C++ program to print the
// NGE's of array elements using
import java.util.TreeSet;
 
class Geeks {
 
    // Function to print the NGE
    static void printNGE(int[] a, int n)
    {
 
        // Tree Set is an ordered set used to
        // store elements in a sorted manner
        TreeSet<Integer> t = new TreeSet<>();
 
        // Adding elements into the set
        for (int i = 0; i < n; i++)
            t.add(a[i]);
 
        System.out.println("ELEMENT     NGE");
 
        for (int i = 0; i < n; i++) {
 
            // If the elements does not have an upper bound
            // or an element greater than it,
            // higher method of TreeSet class will return NULL
            if (t.higher(a[i]) == null)
                System.out.println(a[i] + " ----> "
                                   + "-1");
 
            // Otherwise print the upper bound of that element
            else
                System.out.println(a[i] + " ----> " + t.higher(a[i]));
 
            // Remove the current element from the set
            t.remove(a[i]);
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
 
        int a[] = { 4, 5, 2, 25 };
        int n = a.length;
 
        printNGE(a, n);
    }
}

Python3

# Python3 program to print the
# NGE's of array elements
from bisect import bisect_right as upper_bound, \
                   bisect_left as lower_bound
 
# Function to print the NGE
def printNGE(a: list, n):
    ms = set()
 
    # insert in the multiset container
    for i in range(n):
        ms.add(a[i])
 
    print("Element NGE", end = "")
 
    # Required because Python sets
    # are not sorted
    new_arr = list(ms)
    new_arr.sort()
 
    # traverse for all array elements
    for i in range(n):
 
        # find the upper_bound in set
        it = upper_bound(new_arr, a[i])
 
        # if points to the end, then
        # no NGE of that element
        if (it == len(new_arr)):
            print("\n %d ----> -1" % a[i], end = "")
 
        # print the element at that position
        else:
            print("\n %d ----> %d" % (a[i],
                    new_arr[it]), end = "")
 
        # find the first occurrence of
        # the index element and delete it
        it = lower_bound(new_arr, a[i])
 
        # delete one occurrence
        # from the container
        new_arr.remove(new_arr[it])
 
# Driver Code
if __name__ == "__main__":
    a = [4, 5, 2, 25]
    n = len(a)
 
    # Function call to print the NGE
    printNGE(a, n)
 
# This code is contributed by
# sanjeev2552

Javascript

<script>
// Javascript program to print the
// NGE's of array elements using
 
    // Function to print the NGE
    function printNGE(a , n) {
 
        // Tree Set is an ordered set used to
        // store elements in a sorted manner
        var t = new Set();
 
        // Adding elements into the set
        for (var i = 0; i < n; i++)
            t.add(a[i]);
 
        document.write("ELEMENT     NGE<br/>");
 
        for (i = 0; i < n; i++) {
 
            // If the elements does not have an upper bound
            // or an element greater than it,
            // higher method of TreeSet class will return NULL
            if (upper_bound(t,a[i]) == null)
                document.write(a[i] + " ----> " + "-1"+"<br/>");
 
            // Otherwise print the upper bound of that element
            else
                document.write(a[i] + " ----> " + upper_bound(t,a[i])+"<br/>");
 
            // Remove the current element from the set
            t.delete(a[i]);
        }
    }
    function upper_bound(s, val)
    {
        let temp = [...s];
        temp.sort((a, b) => b - a);
        return temp[temp.indexOf(val) + 1];
    }
     
    // Driver code
        var a = [ 4, 5, 2, 25 ];
        var n = a.length;
 
        printNGE(a, n);
 
// This code contributed by Rajput-Ji
</script>
Producción: 

Element   NGE
   4 ----> 5
   5 ----> 25
   2 ----> 25
   25 ----> -1

 

Complejidad de tiempo : O (N * logN), ya que estamos usando un bucle para atravesar N veces y en cada recorrido estamos insertando en el conjunto que nos costará logN tiempo.

Espacio auxiliar : O (N), ya que estamos usando espacio adicional para establecer ms .
 

Publicación traducida automáticamente

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