Count of Array elements greater than all elements on its left and next K elements on its right
Given an array arr[], the task is to print the number of elements which are greater than all the elements on its left as well as greater than the next K elements on its right.
Examples:
Input: arr[] = { 4, 2, 3, 6, 4, 3, 2}, K = 2
Output: 2
Explanation:
arr[0](= 4): arr[0] is the 1st element in the array and greater than its next K(= 2) elements {2, 3}.
arr[2](= 6): arr[2] is greater than all elements on its left {4, 2, 3} and greater than its next K(= 2) elements {4, 3}.
Therefore, only two elements satisfy the given condition.
Input: arr[] = { 3, 1, 2, 7, 5, 1, 2, 6}, K = 2
Output: 2
Naive Approach:
Traverse over the array and for each element, check if all elements on its left are smaller than it as well as the next K elements on its right are smaller than it. For every such element, increase count. Finally, print count.
Time Complexity: O(N2)
Auxiliary Space: O(1)
Efficient Approach:
The above approach can be optimized by using the Stack Data Structure. Follow the steps below to solve the problem:
- Initialize a new array and store the index of the Next Greater Element for each array element using Stack.
- Traverse the given array and for each element, check if it is maximum obtained so far and its next greater element is at least K indices after the current index. If found to be true, increase count.
- Finally, print count.
Below is the implementation of the above approach:
C++
// C++ Program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Function to print the count of // Array elements greater than all // elements on its left and next K // elements on its right int countElements( int arr[], int n, int k) { stack< int > s; vector< int > next_greater(n, n + 1); // Iterate over the array for ( int i = 0; i < n; i++) { if (s.empty()) { s.push(i); continue ; } // If the stack is not empty and // the element at the top of the // stack is smaller than arr[i] while (!s.empty() && arr[s.top()] < arr[i]) { // Store the index of next // greater element next_greater[s.top()] = i; // Pop the top element s.pop(); } // Insert the current index s.push(i); } // Stores the count int count = 0; int maxi = INT_MIN; for ( int i = 0; i < n; i++) { if (next_greater[i] - i > k && maxi < arr[i]) { maxi = max(maxi, arr[i]); count++; } } return count; } // Driver Code int main() { int arr[] = { 4, 2, 3, 6, 4, 3, 2 }; int K = 2; int n = sizeof (arr) / sizeof (arr[0]); cout << countElements(arr, n, K); return 0; } |
Java
// Java program to implement // the above approach import java.util.*; class GFG{ // Function to print the count of // Array elements greater than all // elements on its left and next K // elements on its right static int countElements( int arr[], int n, int k) { Stack<Integer> s = new Stack<Integer>(); int []next_greater = new int [n + 1 ]; Arrays.fill(next_greater, n); // Iterate over the array for ( int i = 0 ; i < n; i++) { if (s.isEmpty()) { s.add(i); continue ; } // If the stack is not empty and // the element at the top of the // stack is smaller than arr[i] while (!s.isEmpty() && arr[s.peek()] < arr[i]) { // Store the index of next // greater element next_greater[s.peek()] = i; // Pop the top element s.pop(); } // Insert the current index s.add(i); } // Stores the count int count = 0 ; int maxi = Integer.MIN_VALUE; for ( int i = 0 ; i < n; i++) { if (next_greater[i] - i > k && maxi < arr[i]) { maxi = Math.max(maxi, arr[i]); count++; } } return count; } // Driver Code public static void main(String[] args) { int arr[] = { 4 , 2 , 3 , 6 , 4 , 3 , 2 }; int K = 2 ; int n = arr.length; System.out.print(countElements(arr, n, K)); } } // This code is contributed by PrinciRaj1992 |
Python3
# Python3 program to implement # the above approach import sys # Function to print the count of # Array elements greater than all # elements on its left and next K # elements on its right def countElements(arr, n, k): s = [] next_greater = [n] * (n + 1 ) # Iterate over the array for i in range (n): if ( len (s) = = 0 ): s.append(i) continue # If the stack is not empty and # the element at the top of the # stack is smaller than arr[i] while ( len (s) ! = 0 and arr[s[ - 1 ]] < arr[i]): # Store the index of next # greater element next_greater[s[ - 1 ]] = i # Pop the top element s.pop( - 1 ) # Insert the current index s.append(i) # Stores the count count = 0 maxi = - sys.maxsize - 1 for i in range (n): if (next_greater[i] - i > k and maxi < arr[i]): maxi = max (maxi, arr[i]) count + = 1 return count # Driver Code if __name__ = = '__main__' : arr = [ 4 , 2 , 3 , 6 , 4 , 3 , 2 ] K = 2 n = len (arr) # Function call print (countElements(arr, n, K)) # This code is contributed by Shivam Singh |
C#
// C# program to implement // the above approach using System; using System.Collections.Generic; class GFG{ // Function to print the count of // Array elements greater than all // elements on its left and next K // elements on its right static int countElements( int [] arr, int n, int k) { Stack< int > s = new Stack< int >(); int [] next_greater = new int [n + 1]; Array.Fill(next_greater, n); // Iterate over the array for ( int i = 0; i < n; i++) { if (s.Count == 0) { s.Push(i); continue ; } // If the stack is not empty and // the element at the top of the // stack is smaller than arr[i] while (s.Count != 0 && arr[s.Peek()] < arr[i]) { // Store the index of next // greater element next_greater[s.Peek()] = i; // Pop the top element s.Pop(); } // Insert the current index s.Push(i); } // Stores the count int count = 0; int maxi = Int32.MinValue; for ( int i = 0; i < n; i++) { if (next_greater[i] - i > k && maxi < arr[i]) { maxi = Math.Max(maxi, arr[i]); count++; } } return count; } // Driver Code static void Main() { int [] arr = { 4, 2, 3, 6, 4, 3, 2 }; int K = 2; int n = arr.Length; Console.Write(countElements(arr, n, K)); } } // This code is contributed by divyeshrabadiya07 |
Javascript
<script> // JavaScript program to implement // the above approach // Function to print the count of // Array elements greater than all // elements on its left and next K // elements on its right function countElements(arr, n, k) { var s = []; var next_greater = new Array(n + 1).fill(n); // Iterate over the array for ( var i = 0; i < n; i++) { if (s.length === 0) { s.push(i); continue ; } // If the stack is not empty and // the element at the top of the // stack is smaller than arr[i] while (s.length !== 0 && arr[s[s.length - 1]] < arr[i]) { // Store the index of next // greater element next_greater[s[s.length - 1]] = i; // Pop the top element s.pop(); } // Insert the current index s.push(i); } // Stores the count var count = 0; //min integer value var maxi = -2147483648; for ( var i = 0; i < n; i++) { if (next_greater[i] - i > k && maxi < arr[i]) { maxi = Math.max(maxi, arr[i]); count++; } } return count; } // Driver Code var arr = [4, 2, 3, 6, 4, 3, 2]; var K = 2; var n = arr.length; document.write(countElements(arr, n, K)); </script> |
2
Time Complexity: O(N)
Auxiliary Space: O(N)