62. Smallest number on left

Topic :

stack

Difficulty :

medium

Problem Link :


problem statement

Given an array, of integers of length n, find the nearest smaller number for every element such that the smaller element is on the left side. If no small element is present on the left print -1.

Example 1:

Input: n = 3
a = {1, 6, 2}
Output: -1 1 1
Explaination: There is no number at the 
left of 1. Smaller number than 6 and 2 is 1.
Example 2:

Input: n = 6
a = {1, 5, 0, 3, 4, 5}
Output: -1 1 -1 0 3 4
Explaination: Upto 3 it is easy to see 
the smaller numbers. But for 4 the smaller 
numbers are 1, 0 and 3. But among them 3 
is closest. Similary for 5 it is 4.

Your Task:
You do not need to read input or print anything. Your task is to complete the function leftSmaller() which takes n and a as input parameters and returns the list of smaller numbers.

Constraints:
1 ≤ n ≤ 10000
0 ≤ a[i] ≤ 104


solution

TIME COMPLEXITY : O(N)

SPACE COMPLEXITY: O(N)

import java.io.*;
import java.util.*;
 class PreviousSmallerElement
{
    public static void main(String args[]){
      int a[]={1, 5, 0, 3, 4, 5};
      int n=a.length;
      System.out.println(leftSmaller(n,a));
    }
    static List<Integer> leftSmaller(int n, int a[])
    {
      List<Integer>ans= new ArrayList<>();
      Stack<Integer> stack=new Stack<>();//create a stack
      for(int ele:a){
         //if the element at the top of the stack is greater than the curr ele
         //remove that element from the stack
         while(!stack.isEmpty() && stack.peek()>=ele){
             stack.pop();
         }
         //if there are no elements in the stack 
         //it means there are no elements that are smaller than the curr element on its left
         if(stack.isEmpty())
          ans.add(-1);
         else // add the element at the top of the stack 
          ans.add(stack.peek());
         
         stack.push(ele);//push the curr ele to the stack
      }
      return ans;
    }
}
Copyright © 2023 KIZLE. - All Rights Reserved.
Website by Kounik Maitra