A simple approach is to iterate through each element of the array. For every element, first find its next greater element on the right, and then determine the next smaller element to the right of that greater element.
C++
//Driver Code Starts#include<iostream>#include<vector>usingnamespacestd;//Driver Code Endsvector<int>nextSmallerOfNextGreater(intarr[],intn){vector<int>result(n,-1);// For 1st n-1 elements of vectorfor(inti=0;i<n-1;i++){inttemp=arr[i];intnext=-1;intans=-1;// find the next greaterfor(intj=i+1;j<n;j++){if(arr[j]>temp){next=j;break;}}if(next==-1){result[i]=-1;}else{// find the next smaller of the nextfor(intj=next+1;j<n;j++){if(arr[j]<arr[next]){ans=j;break;}}if(ans==-1){result[i]=-1;}else{result[i]=arr[ans];}}}returnresult;}//Driver Code Startsintmain(){intarr[]={5,1,9,2,5,1,7};intn=sizeof(arr)/sizeof(arr[0]);vector<int>result=nextSmallerOfNextGreater(arr,n);for(intx:result){cout<<x<<" ";}cout<<endl;return0;}//Driver Code Ends
Java
//Driver Code Startsimportjava.util.ArrayList;importjava.util.Collections;importjava.util.List;classGfG{//Driver Code EndsstaticList<Integer>nextSmallerOfNextGreater(int[]arr,intn){List<Integer>result=newArrayList<>(Collections.nCopies(n,-1));// For 1st n-1 elements of vectorfor(inti=0;i<n-1;i++){inttemp=arr[i];intnext=-1;intans=-1;// find the next greaterfor(intj=i+1;j<n;j++){if(arr[j]>temp){next=j;break;}}if(next==-1){result.set(i,-1);}else{// find the next smaller of the nextfor(intj=next+1;j<n;j++){if(arr[j]<arr[next]){ans=j;break;}}if(ans==-1){result.set(i,-1);}else{result.set(i,arr[ans]);}}}returnresult;}//Driver Code Startspublicstaticvoidmain(String[]args){int[]arr={5,1,9,2,5,1,7};intn=arr.length;List<Integer>result=nextSmallerOfNextGreater(arr,n);for(intx:result){System.out.print(x+" ");}System.out.println();}}//Driver Code Ends
Python
defnextSmallerOfNextGreater(arr,n):result=[-1]*n# For 1st n-1 elements of vectorforiinrange(n-1):temp=arr[i]next=-1ans=-1# find the next greaterforjinrange(i+1,n):ifarr[j]>temp:next=jbreakifnext==-1:result[i]=-1else:# find the next smaller of the nextforjinrange(next+1,n):ifarr[j]<arr[next]:ans=jbreakifans==-1:result[i]=-1else:result[i]=arr[ans]returnresultif__name__=="__main__":#Driver Code Startsarr=[5,1,9,2,5,1,7]n=len(arr)result=nextSmallerOfNextGreater(arr,n)forxinresult:print(x,end=" ")#Driver Code Ends
C#
//Driver Code StartsusingSystem;usingSystem.Collections.Generic;classGfG{//Driver Code EndsstaticList<int>nextSmallerOfNextGreater(int[]arr,intn){List<int>result=newList<int>(newint[n]);for(inti=0;i<n;i++)result[i]=-1;// For 1st n-1 elements of vectorfor(inti=0;i<n-1;i++){inttemp=arr[i];intnext=-1;intans=-1;// find the next greaterfor(intj=i+1;j<n;j++){if(arr[j]>temp){next=j;break;}}if(next==-1){result[i]=-1;}else{// find the next smaller of the nextfor(intj=next+1;j<n;j++){if(arr[j]<arr[next]){ans=j;break;}}if(ans==-1){result[i]=-1;}else{result[i]=arr[ans];}}}returnresult;}//Driver Code StartsstaticvoidMain(){int[]arr={5,1,9,2,5,1,7};intn=arr.Length;List<int>result=nextSmallerOfNextGreater(arr,n);foreach(intxinresult){Console.Write(x+" ");}Console.WriteLine();}}//Driver Code Ends
JavaScript
functionnextSmallerOfNextGreater(arr,n){letresult=newArray(n).fill(-1);// For 1st n-1 elements of vectorfor(leti=0;i<n-1;i++){lettemp=arr[i];letnext=-1;letans=-1;// find the next greaterfor(letj=i+1;j<n;j++){if(arr[j]>temp){next=j;break;}}if(next===-1){result[i]=-1;}else{// find the next smaller of the nextfor(letj=next+1;j<n;j++){if(arr[j]<arr[next]){ans=j;break;}}if(ans===-1){result[i]=-1;}else{result[i]=arr[ans];}}}returnresult;}//Driver Code Starts//Driver codeletarr=[5,1,9,2,5,1,7];letn=arr.length;letresult=nextSmallerOfNextGreater(arr,n);console.log(result.join(" "));//Driver Code Ends
Output
2 2 -1 1 -1 -1 -1
Using Monotonic Stack - O(n) Time and O(1) Space
The idea is to first determine the next greater element (NGE) for every element in the array. This can be efficiently done using a stack, which helps process elements in linear time while keeping track of indices whose next greater element has not yet been found.
Once the next greater element indices are stored, we then compute the next smaller element (NSE) for each element in the array using a similar stack-based approach.
Finally, we combine both results: for each element, we take its next greater element, and then find the next smaller element of that greater element. If any step does not exist, we return -1. This combined information gives us the next smaller element of the next greater element for every array element.
C++
//Driver Code Starts#include<iostream>#include<stack>#include<vector>usingnamespacestd;//Driver Code Endsvector<int>nextSmallerOfNextGreater(intarr[],intn){// store index of next greater elementvector<int>nge(n,-1);// store value of next smaller elementvector<int>nse(n,-1);stack<int>st;vector<int>result(n,-1);// Find Next Greater Element index for each elementfor(inti=n-1;i>=0;i--){while(!st.empty()&&arr[st.top()]<=arr[i])st.pop();if(!st.empty())nge[i]=st.top();st.push(i);}// clear stack for next computationwhile(!st.empty())st.pop();// Find Next Smaller Element value for each elementfor(inti=n-1;i>=0;i--){while(!st.empty()&&arr[st.top()]>=arr[i])st.pop();if(!st.empty())nse[i]=arr[st.top()];st.push(i);}// Step 3: Combine resultsfor(inti=0;i<n;i++){if(nge[i]==-1)continue;elseresult[i]=nse[nge[i]];}returnresult;}//Driver Code Startsintmain(){intarr[]={5,1,9,2,5,1,7};intn=sizeof(arr)/sizeof(arr[0]);vector<int>result=nextSmallerOfNextGreater(arr,n);for(intx:result){cout<<x<<" ";}cout<<endl;return0;}//Driver Code Ends
Java
//Driver Code Startsimportjava.util.ArrayList;importjava.util.Arrays;importjava.util.Collections;importjava.util.Stack;publicclassGfG{staticArrayList<Integer>//Driver Code EndsnextSmallerOfNextGreater(int[]arr,intn){int[]nge=newint[n];int[]nse=newint[n];Arrays.fill(nge,-1);Arrays.fill(nse,-1);Stack<Integer>st=newStack<>();ArrayList<Integer>result=newArrayList<>(Collections.nCopies(n,-1));// Next Greater Element indexfor(inti=n-1;i>=0;i--){while(!st.isEmpty()&&arr[st.peek()]<=arr[i])st.pop();if(!st.isEmpty())nge[i]=st.peek();st.push(i);}st.clear();// Next Smaller Element valuefor(inti=n-1;i>=0;i--){while(!st.isEmpty()&&arr[st.peek()]>=arr[i])st.pop();if(!st.isEmpty())nse[i]=arr[st.peek()];st.push(i);}// Combine resultsfor(inti=0;i<n;i++){if(nge[i]!=-1)result.set(i,nse[nge[i]]);}returnresult;}//Driver Code Startspublicstaticvoidmain(String[]args){int[]arr={5,1,9,2,5,1,7};intn=arr.length;ArrayList<Integer>res=nextSmallerOfNextGreater(arr,n);for(intx:res)System.out.print(x+" ");}}//Driver Code Ends
Python
defnextSmallerOfNextGreater(arr):n=len(arr)nge=[-1]*nnse=[-1]*nresult=[-1]*nstack=[]# Next Greater Element indexforiinrange(n-1,-1,-1):whilestackandarr[stack[-1]]<=arr[i]:stack.pop()ifstack:nge[i]=stack[-1]stack.append(i)stack.clear()# Next Smaller Element valueforiinrange(n-1,-1,-1):whilestackandarr[stack[-1]]>=arr[i]:stack.pop()ifstack:nse[i]=arr[stack[-1]]stack.append(i)# Combine resultsforiinrange(n):ifnge[i]!=-1:result[i]=nse[nge[i]]returnresultif__name__=="__main__":arr=[5,1,9,2,5,1,7]res=nextSmallerOfNextGreater(arr)print(*res)
C#
//Driver Code StartsusingSystem;usingSystem.Collections.Generic;classGfG{//Driver Code EndsstaticList<int>nextSmallerOfNextGreater(int[]arr,intn){int[]nge=newint[n];int[]nse=newint[n];for(inti=0;i<n;i++){nge[i]=-1;nse[i]=-1;}Stack<int>st=newStack<int>();List<int>result=newList<int>(newint[n]);for(inti=0;i<n;i++)result[i]=-1;// Next Greater Element indexfor(inti=n-1;i>=0;i--){while(st.Count>0&&arr[st.Peek()]<=arr[i])st.Pop();if(st.Count>0)nge[i]=st.Peek();st.Push(i);}st.Clear();// Next Smaller Element valuefor(inti=n-1;i>=0;i--){while(st.Count>0&&arr[st.Peek()]>=arr[i])st.Pop();if(st.Count>0)nse[i]=arr[st.Peek()];st.Push(i);}// Combine resultsfor(inti=0;i<n;i++){if(nge[i]!=-1)result[i]=nse[nge[i]];}returnresult;}//Driver Code StartsstaticvoidMain(){int[]arr={5,1,9,2,5,1,7};List<int>res=nextSmallerOfNextGreater(arr,arr.Length);foreach(intxinres)Console.Write(x+" ");}}//Driver Code Ends
JavaScript
functionnextSmallerOfNextGreater(arr){letn=arr.length;letnge=newArray(n).fill(-1);letnse=newArray(n).fill(-1);letresult=newArray(n).fill(-1);letstack=[];// Next Greater Element indexfor(leti=n-1;i>=0;i--){while(stack.length&&arr[stack[stack.length-1]]<=arr[i])stack.pop();if(stack.length)nge[i]=stack[stack.length-1];stack.push(i);}stack=[];// Next Smaller Element valuefor(leti=n-1;i>=0;i--){while(stack.length&&arr[stack[stack.length-1]]>=arr[i])stack.pop();if(stack.length)nse[i]=arr[stack[stack.length-1]];stack.push(i);}// Combinefor(leti=0;i<n;i++){if(nge[i]!==-1)result[i]=nse[nge[i]];}returnresult;}// Driver code//Driver Code Startsletarr=[5,1,9,2,5,1,7];letres=nextSmallerOfNextGreater(arr);console.log(res.join(" "));//Driver Code Ends