Smallest Greater Element on Right Side

Given an array of distinct elements, print the closest greater element for every element. The closest greater element for an element x is the smallest element on the right side of x in array which is greater than x. Elements for which no greater element exist, consider next greater element as -1.

Examples:

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

Approach: In this post, we will be discussing how to find the Next Greater Element using C++ STL(set).
Finding the smallest greater element on the right side will be like finding the first greater element of the current element in a list that is sorted.
Consider example 1, The sorted list would look like 2, 4, 5, 25.
Here for element 4, the greater element is 5 as it is next to it, so we print 5 and remove 4 because it would not be greater to the other elements since it is no longer on anyone’s right.
Similarly, for 5 it is 25 and we remove 5 from the list, as 5 will not be on the right side of 2 or 25, so it can be deleted.



Given below are the steps to find the Next Greater Element of every index element.

Below is the implementation of the above approach.

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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);
    }
}
chevron_right

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

Time Complexity: O(N log N)




Striver(underscore)79 at Codechef and codeforces D

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.





Article Tags :
Practice Tags :