In the Number of NGEs to the right problem we have given an array a[ ] of size n and q number of queries representing the index of the array. For each query, i print the total number of next greater elements to it’s right.
Table of Contents
Example
Input
a[ ] = {3, 4, 2, 7, 5, 8, 10, 6}
q1 = 0
q2 = 5
Output
4
1
Input
a[ ] = {1, 2, 3, 4, 5, 6, 7}
q1 = 0
Output
6
Naive Method
Algorithm
- Initialize an array a[ ] of size n.
- Create a variable c to count the NGEs and initialize it as 0.
- Create a variable lastEle and store the value of array a[ ] at index q i.e. query in it.
- Traverse from q+1 to n-1 and check if the value of array a[ ] at current index is greater than lastEle, update lastEle as the value of array a[ ] at the current index. Increment the count.
- Print the count.
C++ Program to count the number of NGEs to the right
#include <bits/stdc++.h> using namespace std; void count(int a[], int n, int q){ int c = 0; int lastEle = a[q]; for(int i=q+1; i<n; i++){ if(a[i]>lastEle){ lastEle = a[i]; c++; } } cout<<c<<endl; } int main(){ int a[] = {3, 4, 2, 7, 5, 8, 10, 6}; int n = sizeof(a) / sizeof(a[0]); count(a, n, 0); count(a, n, 5); return 0; }
4 1
Java Program to count the number of NGEs to the right
import java.util.*; class NGE{ static void count(int a[], int n, int q){ int c = 0; int lastEle = a[q]; for(int i=q+1; i<n; i++){ if(a[i]>lastEle){ lastEle = a[i]; c++; } } System.out.println(c); } public static void main(String args[]){ int a[] = {3, 4, 2, 7, 5, 8, 10, 6}; int n = a.length; count(a, n, 0); count(a, n, 5); } }
4 1
Complexity Analysis
Time Complexity: O(n) where n is the size of array a[ ].
Auxiliary Space: O(1) because we used constant extra space.
Efficient Method
Algorithm
- Initialize an array a[ ] of size n containing numbers and a dp array of the same size.
- Create an array next[ ] of size n and set its element as 0.
- Create a stack and push 0 in it.
- Traverse from 1 to n-1 and while the stack is not empty check if the value in array a[ ] at the index equal to the top of the stack is less than the value in array a[ ] at current index, update the value in array next at the index equal to the top of the stack as a current index. Pop the top of the stack.
- Else break the loop.
- Push the current index in the stack.
- While stack is not empty update the value in array next at the index equal to the top of the stack as -1. Pop the top of the stack.
- Traverse through n-2 to 0 and check value in array next at current index is -1, update the value in array dp at current index as 0. Else update value in array next at current index as 1 + dp[next[i]].
- For each query equals to i print dp[I].
C++ Program to count the number of NGEs to the right
#include <bits/stdc++.h> using namespace std; void computeNext(int next[], int a[], int n){ stack<int> s; s.push(0); for(int i = 1; i < n; i++){ while(!s.empty()){ int cur = s.top(); if(a[cur] < a[i]){ next[cur] = i; s.pop(); } else{ break; } } s.push(i); } while(!s.empty()){ int cur = s.top(); next[cur] = -1; s.pop(); } } void count(int a[], int dp[], int n){ int next[n]; memset(next, 0, sizeof(next)); computeNext(next, a, n); for(int i = n-2; i >= 0; i--){ if(next[i] == -1){ dp[i] = 0; } else{ dp[i] = 1 + dp[next[i]]; } } } int answerQuery(int dp[], int index){ return dp[index]; } int main(){ int a[] = {3, 4, 2, 7, 5, 8, 10, 6}; int n = sizeof(a) / sizeof(a[0]); int dp[n]; count(a, dp, n); cout<<answerQuery(dp, 0)<<endl; cout<<answerQuery(dp, 5)<<endl; return 0; }
4 1
Java Program to count the number of NGEs to the right
import java.util.*; class NGE{ static void computeNext(int next[], int a[], int n){ Stack<Integer> s = new Stack<Integer>(); s.push(0); for(int i = 1; i < n; i++){ while(s.size() > 0){ int cur = s.peek(); if(a[cur] < a[i]){ next[cur] = i; s.pop(); } else{ break; } } s.push(i); } while(s.size() > 0){ int cur = s.peek(); next[cur] = -1; s.pop(); } } static void count(int a[], int dp[], int n){ int next[] = new int[n]; for(int i = 0; i < n; i++){ next[i] = 0; } computeNext(next, a, n); for(int i = n-2; i >= 0; i--){ if(next[i] == -1){ dp[i] = 0; } else{ dp[i] = 1 + dp[next[i]]; } } } static int answerQuery(int dp[], int index){ return dp[index]; } public static void main(String args[]){ int a[] = {3, 4, 2, 7, 5, 8, 10, 6}; int n = a.length; int dp[] = new int[n]; count(a, dp, n); System.out.println(answerQuery(dp, 0)); System.out.println(answerQuery(dp, 5)); } }
4 1
Complexity Analysis
Time Complexity: O(1) because all the queries are taking constant time due to pre-computations.
Auxiliary Space: O(n) where n is the size of array a[ ].