Given an array arr[] consisting of N distinct integers, the task is to print for each array element, all the greater elements present on its left.
Examples:
Input: arr[] = {5, 3, 9, 0, 16, 12}
Output:
5:
3: 5
9:
0: 9 5 3
16:
12: 16
Input: arr[] = {1, 2, 0}
Output:
1:
2:
0: 2 1
Naive Approach: The simplest approach to solve the problem is to traverse the array and for each array element, traverse all its preceding elements and print the ones that are greater than the current element.
C++
#include <bits/stdc++.h>
using namespace std;
void printGreater(vector< int >& arr)
{
int n = arr.size();
for ( int i = 0; i < n; i++)
{
vector< int > result;
for ( int j = i - 1; j >= 0; j--)
{
if (arr[j] > arr[i])
{
result.push_back(arr[j]);
}
}
cout << arr[i] << ": " ;
for ( int k = 0; k < result.size(); k++)
{
cout << result[k] << " " ;
}
cout << endl;
}
}
int main()
{
vector< int > arr{5, 3, 9, 0, 16, 12};
printGreater(arr);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void printGreater(ArrayList<Integer> arr)
{
int n = arr.size();
for ( int i = 0 ; i < n; i++)
{
ArrayList<Integer> result
= new ArrayList<Integer>();
for ( int j = i - 1 ; j >= 0 ; j--)
{
if (arr.get(j) > arr.get(i))
{
result.add(arr.get(j));
}
}
System.out.print(arr.get(i) + ": " );
for ( int k = 0 ; k < result.size(); k++)
{
System.out.print(result.get(k) + " " );
}
System.out.println();
}
}
public static void main(String args[])
{
ArrayList<Integer> arr = new ArrayList<Integer>(Arrays.asList( 5 , 3 , 9 , 0 , 16 , 12 ));
printGreater(arr);
}
}
|
Python3
def printGreater(arr):
n = len (arr)
for i in range (n):
result = []
j = i - 1
while (j > = 0 ):
if (arr[j] > arr[i]):
result.append(arr[j])
j - = 1
print (arr[i], end = ": " )
for k in range ( len (result)):
print (result[k], end = " " )
print ( "\n" , end = "")
if __name__ = = '__main__' :
arr = [ 5 , 3 , 9 , 0 , 16 , 12 ]
printGreater(arr)
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void printGreater( int [] arr)
{
int n = arr.Length;
for ( int i = 0; i < n; i++)
{
List< int > result = new List< int >();
for ( int j = i - 1; j >= 0; j--)
{
if (arr[j] > arr[i]) {
result.Add(arr[j]);
}
}
Console.Write(arr[i] + ": " );
for ( int k = 0; k < result.Count; k++) {
Console.Write(result[k] + " " );
}
Console.WriteLine();
}
}
public static void Main()
{
int [] arr = { 5, 3, 9, 0, 16, 12 };
printGreater(arr);
}
}
|
Javascript
<script>
function printGreater(arr)
{
let n = arr.length;
for (let i = 0; i < n; i++)
{
let result = [];
for (let j = i - 1; j >= 0; j--)
{
if (arr[j] > arr[i]) {
result.push(arr[j]);
}
}
document.write(arr[i] + ": " );
for (let k = 0; k < result.length; k++) {
document.write(result[k] + " " );
}
document.write( "</br>" );
}
}
let arr = [ 5, 3, 9, 0, 16, 12 ];
printGreater(arr);
</script>
|
Output5:
3: 5
9:
0: 9 3 5
16:
12: 16
Time Complexity: O(N2)
Auxiliary Space: O(N)
Efficient Approach: To optimize the above approach, the idea is to make use of a self-balancing Binary Search Trees. Set in C++ is implemented using self-balancing BSTs and can be used to solve this problem. Follow the steps to solve the problem:
- Initialize a Set s, that stores the elements in non-decreasing order.
- Traverse the array over the indices 0 to N – 1 and perform the following operations:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void printGreater(vector< int >& arr)
{
int n = arr.size();
set< int , greater< int > > s;
for ( int i = 0; i < n; i++) {
auto p = s.insert(arr[i]);
auto j = s.begin();
cout << arr[i] << ": " ;
while (j != p.first) {
cout << *j << " " ;
j++;
}
cout << endl;
}
}
int main()
{
vector< int > arr{ 5, 3, 9, 0, 16, 12 };
printGreater(arr);
return 0;
}
|
Java
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG{
static void printGreater( int arr[])
{
int n = arr.length;
TreeSet<Integer> s = new TreeSet<>(
Collections.reverseOrder());
for ( int i = 0 ; i < n; i++)
{
s.add(arr[i]);
System.out.print(arr[i] + ": " );
for ( int v : s)
{
if (v == arr[i])
break ;
System.out.print(v + " " );
}
System.out.println();
}
}
public static void main(String[] args)
{
int arr[] = { 5 , 3 , 9 , 0 , 16 , 12 };
printGreater(arr);
}
}
|
Python3
def printGreater(arr):
n = len (arr)
s = set ([])
for i in range (n):
s.add(arr[i])
print (arr[i], ": " , sep = " ", end = " ")
temp = list (s)
temp.sort()
temp.reverse()
for v in range ( len (temp)):
if (temp[v] = = arr[i]):
break
print (temp[v], end = " " )
print ()
arr = [ 5 , 3 , 9 , 0 , 16 , 12 ]
printGreater(arr)
|
C#
using System;
using System.Collections.Generic;
class GFG {
static void printGreater( int [] arr)
{
int n = arr.Length;
HashSet< int > s = new HashSet< int >();
for ( int i = 0; i < n; i++)
{
s.Add(arr[i]);
Console.Write(arr[i] + ": " );
List< int > temp = new List< int >();
foreach ( int v in s)
{
temp.Add(v);
}
temp.Sort();
temp.Reverse();
for ( int v = 0; v < temp.Count; v++)
{
if (temp[v] == arr[i])
{
break ;
}
Console.Write(temp[v] + " " );
}
Console.WriteLine();
}
}
static void Main() {
int [] arr = { 5, 3, 9, 0, 16, 12 };
printGreater(arr);
}
}
|
Javascript
<script>
function printGreater(arr)
{
let n = arr.length;
let s = new Set();
for (let i = 0; i < n; i++)
{
s.add(arr[i]);
document.write(arr[i] + ": " );
let temp=Array.from(s).sort( function (a,b){ return b-a;});
for (let v=0;v< temp.length;v++)
{
if (temp[v] == arr[i])
break ;
document.write(temp[v] + " " );
}
document.write( "<br>" );
}
}
let arr=[5, 3, 9, 0, 16, 12];
printGreater(arr);
</script>
|
Output5:
3: 5
9:
0: 9 5 3
16:
12: 16
Time Complexity: O(N2log(N))
Auxiliary Space: O(N)