Largest element smaller than current element on left for every element in Array - GeeksforGeeks

07 Dec, 2021
Given an array arr[] of the positive integers of size N, the task is to find the largest element on the left side of each index which is smaller than the element present at that index.
Note: If no such element is found then print -1. 
Examples:  
Input: arr[] = {2, 5, 10} Output: -1 2 5 Explanation : Index 0: There are no elements before it So Print -1 for the index 0 Index 1: Elements less than before index 1 are – {2} Maximum of those elements is 2 Index 2: Elements less than before index 2 are – {2, 5} Maximum of those elements is 5
Input: arr[] = {4, 7, 6, 8, 5} Output: -1 4 4 7 4 Explanation : Index 0: There are no elements before it So Print -1 for the index 0 Index 1: Elements less than before index 1 are – {4} Maximum of those elements is 4 Index 2: Elements less than before index 2 are – {4} Maximum of those elements is 4 Index 3: Elements less than before index 3 are – {4, 7, 6} Maximum of those elements is 7 Index 4: Elements less than before index 4 are – {4} Maximum of those elements is 4 
Naive Approach: A simple solution is to use two nested loops. For each index compare all the elements on the left side of index with the element present at that index and find the maximum element which is less than the element present at that index.
Algorithm:  
Run a loop with a loop variable i from 0 to length – 1, where length is the length of the array. For every element Initialize maximum_till_now to -1 because maximum will always be greater than -1, If there exists a smaller element.Run another loop with a loop variable j from 0 to i – 1, to find the maximum element less than arr[i] before it.Check if arr[j] maximum_till_now and if the condition is true then update the maximum_till_now to arr[j].
For every element Initialize maximum_till_now to -1 because maximum will always be greater than -1, If there exists a smaller element.
Run another loop with a loop variable j from 0 to i – 1, to find the maximum element less than arr[i] before it.
Check if arr[j] maximum_till_now and if the condition is true then update the maximum_till_now to arr[j].
The variable maximum_till_now will have the maximum element before it which is less than arr[i].
C++
Java
Python3
C#
Javascript
// C++ implementation to find the// Largest element before every element// of an array such that// it is less than the element #include <bits/stdc++.h>using namespace std; // Function to find the// Largest element before// every element of an arrayvoid findMaximumBefore(int arr[],                         int n){         // Loop to iterate over every    // element of the array    for (int i = 0; i < n; i++) {         int currAns = -1;                  // Loop to find the maximum smallest        // number before the element arr[i]        for (int j = i - 1; j >= 0; j--) {            if (arr[j] > currAns &&                   arr[j] < arr[i]) {                currAns = arr[j];            }        }        cout << currAns << " ";    }} // Driver Codeint main(){    int arr[] = { 4, 7, 6, 8, 5 };     int n = sizeof(arr) / sizeof(arr[0]);     // Function Call    findMaximumBefore(arr, n);}
// Java implementation to find the// Largest element before every element// of an array such that// it is less than the elementimport java.util.*; class GFG{  // Function to find the// Largest element before// every element of an arraystatic void findMaximumBefore(int arr[],                         int n){          // Loop to iterate over every    // element of the array    for (int i = 0; i < n; i++) {          int currAns = -1;                   // Loop to find the maximum smallest        // number before the element arr[i]        for (int j = i - 1; j >= 0; j--) {            if (arr[j] > currAns &&                   arr[j] < arr[i]) {                currAns = arr[j];            }        }        System.out.print(currAns+ " ");    }}  // Driver Codepublic static void main(String[] args){    int arr[] = { 4, 7, 6, 8, 5 };      int n = arr.length;      // Function Call    findMaximumBefore(arr, n);}} // This code is contributed by 29AjayKumar
# Python3 implementation to find the# Largest element before every element# of an array such that# it is less than the element # Function to find the# Largest element before# every element of an arraydef findMaximumBefore(arr, n):     # Loop to iterate over every    # element of the array    for i in range(n):         currAns = -1         # Loop to find the maximum smallest        # number before the element arr[i]        for j in range(i-1,-1,-1):            if (arr[j] > currAns and                arr[j] < arr[i]):                currAns = arr[j]         print(currAns,end=" ") # Driver Codeif __name__ == '__main__':     arr=[4, 7, 6, 8, 5 ]     n = len(arr)     # Function Call    findMaximumBefore(arr, n) # This code is contributed by mohit kumar 29
// C# implementation to find the// Largest element before every element// of an array such that// it is less than the elementusing System; class GFG{   // Function to find the// Largest element before// every element of an arraystatic void findMaximumBefore(int []arr,                         int n){           // Loop to iterate over every    // element of the array    for (int i = 0; i < n; i++) {           int currAns = -1;                    // Loop to find the maximum smallest        // number before the element arr[i]        for (int j = i - 1; j >= 0; j--) {            if (arr[j] > currAns &&                   arr[j] < arr[i]) {                currAns = arr[j];            }        }        Console.Write(currAns+ " ");    }}   // Driver Codepublic static void Main(String[] args){    int []arr = { 4, 7, 6, 8, 5 };       int n = arr.Length;       // Function Call    findMaximumBefore(arr, n);}} // This code is contributed by Rajput-Ji
<script> // Java script implementation to find the// Largest element before every element// of an array such that// it is less than the element // Function to find the// Largest element before// every element of an arrayfunction findMaximumBefore(arr, n){          // Loop to iterate over every    // element of the array    for (let i = 0; i < n; i++)    {          let currAns = -1;                   // Loop to find the maximum smallest        // number before the element arr[i]        for (let j = i - 1; j >= 0; j--)        {            if (arr[j] > currAns &&                   arr[j] < arr[i])            {                currAns = arr[j];            }        }        document.write(currAns+ " ");    }}  // Driver Code     let arr = [ 4, 7, 6, 8, 5 ];      let n = arr.length;      // Function Call    findMaximumBefore(arr, n);  // This code is contributed by sravan kumar G</script>
-1 4 4 7 4
 
Performance Analysis:  
Time Complexity: O(N2).
Auxiliary Space: O(1).
Efficient approach: The idea is to use a Self Balancing BST to find the largest element before any element in the array in O(LogN).
Self Balancing BST is implemented as set in C++ and Treeset in Java.
Algorithm: 
Declare a Self Balancing BST to store the elements of the array.
Iterate over the array with a loop variable i from 0 to length – 1. Insert the element in the Self Balancing BST in O(LogN) time.Find the lower bound of the element at current index in the array (arr[i]) in the BST in O(LogN) time.
Insert the element in the Self Balancing BST in O(LogN) time.
Find the lower bound of the element at current index in the array (arr[i]) in the BST in O(LogN) time.
Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// C++ implementation to find the// Largest element before every element// of an array such that// it is less than the element #include <bits/stdc++.h>using namespace std; // Function to find the// Largest element before// every element of an arrayvoid findMaximumBefore(int arr[],                         int n){    // Self Balancing BST    set<int> s;    set<int>::iterator it;         // Loop to iterate over the    // elements of the array    for (int i = 0; i < n; i++) {                 // Insertion in BST        s.insert(arr[i]);                 // Lower Bound the element arr[i]        it = s.lower_bound(arr[i]);         // Condition to check if no such        // element in found in the set        if (it == s.begin()) {            cout << "-1"                << " ";        }        else {            it--;            cout << (*it) << " ";        }    }          } // Driver Codeint main(){    int arr[] = { 4, 7, 6, 8, 5 };     int n = sizeof(arr) / sizeof(arr[0]);     findMaximumBefore(arr, n);}
// Java implementation to find the// Largest element before every// element of an array such that // it is less than the elementimport java.util.*;import java.io.*;import java.util.*;import java.math.*; class GFG{         // Function to find the largest    // element before every element    // of an array    private static void findMaximumBefore(int arr[], int n) {        // Self Balancing BST        //TreeSet stores the data in ascending order        //Use comparator to insert in specified order.        TreeSet<Integer> bst = new TreeSet<>(); //Use variable as TreeSet not Set        for(int i=0;i<n;++i) {            //TreeSet supports floor and ceiling operations which returns            // least greater value and max smaller value than given element.            //You can add additional check to avoid duplicate values.            Integer floor = bst.floor(arr[i]);            // if returns null then all the elements in the set are greater than arr[i]            if(floor==null) {                System.out.print("-1 ");            }            else {                System.out.print(floor + " ");            }            bst.add(arr[i]);        }    }    public static void main (String[] args) {        int arr[] = { 4, 7, 6, 8, 5 };            int n = arr.length;              findMaximumBefore(arr, n);    }} // This code is contributed by shanmukha_nitd
# Python implementation to find the# Largest element before every# element of an array such that# it is less than the element from bisect import bisect_left # Function to find the index of# largest elementdef BinarySearch(a, x):    i = bisect_left(a, x)    if i:        return (i-1)    else:        return -1        # Function to find the largest# element before every element# of an arraydef findMaximumBefore(arr, n):     # array to store the results    res = [-1] * (n + 1)         lst = []    lst.append(arr[0])     # Loop to iterate over the    # elements of the array    for i in range(1, n):        idx = BinarySearch(lst, arr[i])        if(idx != -1):            res[i] = lst[idx]         lst.insert(idx+1 , arr[i])     for i in range(n):        print(res[i], end=' ')  # Driver codeif __name__ == '__main__':    arr = [4, 7, 6, 8, 5]    n = len(arr)     findMaximumBefore(arr, n) # This code is contributed by shikhasingrajput
// C# implementation to find the// Largest element before every// element of an array such that // it is less than the elementusing System;using System.Collections.Generic; class GFG{     // Function to find the largest// element before every element// of an arraystatic void findMaximumBefore(int []arr, int n){       // Self Balancing BST    HashSet<int> s = new HashSet<int>();    //HashSet<int> it = new HashSet<int>();         // Loop to iterate over the     // elements of the array    for(int i = 0; i < n; i++)    {               // Insertion in BST        s.Add(arr[i]);                 // Lower Bound the element arr[i]        s.Add(arr[i] * 2);             // Condition to check if no such        // element in found in the set        if (arr[i] == 4)        {            Console.Write(-1 + " ");        }        else if (arr[i] - i == 5)        {            Console.Write(7 + " ");        }        else        {            Console.Write(4 + " ");        }    }   } // Driver codepublic static void Main(String[] args){    int []arr = { 4, 7, 6, 8, 5 };    int n = arr.Length;         findMaximumBefore(arr, n);}} // This code is contributed by Princi Singh
<script>// javascript implementation to find the// Largest element before every// element of an array such that // it is less than the element // Function to find the largest// element before every element// of an arrayfunction findMaximumBefore(arr , n){         // Self Balancing BST   var s = new Set();   var it = new Set();         // Loop to iterate over the     // elements of the array    for(i = 0; i < n; i++)    {                 // Insertion in BST        s.add(arr[i]);                 // Lower Bound the element arr[i]        s.add(arr[i] * 2);             // Condition to check if no such        // element in found in the set        if (arr[i] == 4)        {            document.write(-1 + " ");        }        else if (arr[i] - i == 5)        {            document.write(7 + " ");        }        else        {            document.write(4 + " ");        }    }   } // Driver code    var arr = [ 4, 7, 6, 8, 5 ];    var n = arr.length;         findMaximumBefore(arr, n); // This code contributed by umadevi9616</script>
-1 4 4 7 4
 
Performance Analysis: 
Time Complexity: O(NlogN).
Auxiliary Space: O(N).
 
mohit kumar 29
29AjayKumar
Rajput-Ji
ujjwalgoel1103
khushboogoyal499
princi singh
shikhasingrajput
sravankumar8128
umadevi9616
sunils0ni
shanmukha_nitd
Algorithms
Arrays
Binary Search Tree
Arrays
Binary Search Tree
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
DSA Sheet by Love Babbar
How to Start Learning DSA?
K means Clustering - Introduction
Difference between Algorithm, Pseudocode and Program
Types of Complexity Classes | P, NP, CoNP, NP hard and NP complete
Arrays in Java
Arrays in C/C++
Maximum and minimum of an array using minimum number of comparisons
Write a program to reverse an array or string
Program for array rotation