Given an array a[ ] of size n. For every window size that varies from 1 to n in array print or find maximum of minimum for every window size in a given array.
Table of Contents
Example
Input : a[ ] = {10, 20, 30, 50, 10, 70, 30}
Output : 70 30 20 10 10 10 10
Input : a[ ] = {10, 20, 30}
Output : 30 20 10
Naive Method for Find Maximum of Minimum for Every Window Size
Algorithm
- Initialize an array a[ ] of size n.
- Traverse through the array a[ ]. Initialize an integer variable to store a maximum of minimum’s and set its value as INT_MIN.
- After that, Iterate through all the windows of the array of sizes equal to the current index of the outer loop. Initialize a variable to store the minimum of the current window and store the value at the current index in array a[ ] in it.
- Similarly, Traverse to find the minimum element of the array’s current window and store the minimum value in the variable to store the minimum of the current window.
- Check if the variable of the minimum of the current window is greater than the variable of a maximum of minimum’s, update the variable of the maximum of minimum’s as variable of the minimum of the current window.
- Print the variable of the maximum of the minimum.
C++ Program
#include <bits/stdc++.h> using namespace std; void printMaxOfMin(int a[], int n){ for(int k=1; k<=n; k++){ int maxOfMin = INT_MIN; for(int i = 0; i <= n-k; i++){ int min = a[i]; for(int j = 1; j < k; j++){ if(a[i+j] < min){ min = a[i+j]; } } if(min > maxOfMin){ maxOfMin = min; } } cout << maxOfMin << " "; } } int main(){ int a[] = {10, 20, 30, 50, 10, 70, 30}; int n = sizeof(a)/sizeof(a[0]); printMaxOfMin(a, n); return 0; }
70 30 20 10 10 10 10
Java Program
class MaxOfMin{ static int a[] = {10, 20, 30, 50, 10, 70, 30}; static void printMaxOfMin(int n){ for(int k=1; k<=n; k++){ int maxOfMin = Integer.MIN_VALUE; for(int i = 0; i <= n-k; i++){ int min = a[i]; for(int j = 1; j < k; j++){ if(a[i+j] < min){ min = a[i+j]; } } if(min > maxOfMin){ maxOfMin = min; } } System.out.print(maxOfMin + " "); } } public static void main(String[] args){ printMaxOfMin(a.length); } }
70 30 20 10 10 10 10
Complexity Analysis for Find Maximum of Minimum for Every Window Size
Time Complexity: O(n3) where n is the number of elements in the given array a[ ].
Auxiliary Space: O(1) because we used constant extra space.
Efficient Method for Find Maximum of Minimum for Every Window Size
Algorithm
- Initialize an array a[ ] of size n.
- Create a stack data structure and 2 arrays left and right of length n+1. Traverse and set all the values of array left as -1 and array right as n.
- Traverse from 0 to n-1 and while the stack is not empty and the value in array a[ ] at index equals to the top of the stack is greater than or equal to the value in array a[ ] at current index, pop the element at the top of the stack.
- If the stack is not empty, update the value at the current index in an array left as the top of the stack. Push the current index in the stack.
- While the stack is not empty, pop the element at the top of the stack.
- Similarly, traverse from n-1 to 0 and while the stack is not empty and the value in array a[ ] at index equals to the top of the stack is greater than or equal to the value in array a[ ] at current index, pop the element at the top of the stack.
- If the stack is not empty, update the value at the current index in array right as the top of the stack. Push the current index in the stack.
- Create another array of size n+1 to store answers and set all of its values as 0.
- Traverse from 0 to n-1 and find the length of the window between values at the current index of right and left array and update the array of answers as a maximum of values at the current index of array a[ ] and at the index equal to the calculated interval of an array of answers.
- Print the array of answers.
C++ Program
#include <bits/stdc++.h> using namespace std; void printMaxOfMin(int a[], int n){ stack<int> s; int left[n+1]; int right[n+1]; for(int i=0; i<n; i++){ left[i] = -1; right[i] = n; } for(int i=0; i<n; i++){ while(!s.empty() && a[s.top()] >= a[i]){ s.pop(); } if(!s.empty()){ left[i] = s.top(); } s.push(i); } while(!s.empty()){ s.pop(); } for(int i = n-1 ; i>=0 ; i--){ while(!s.empty() && a[s.top()] >= a[i]){ s.pop(); } if(!s.empty()){ right[i] = s.top(); } s.push(i); } int ans[n+1]; for(int i=0; i<=n; i++){ ans[i] = 0; } for(int i=0; i<n; i++){ int len = right[i] - left[i] - 1; ans[len] = max(ans[len], a[i]); } for(int i=n-1; i>=1; i--){ ans[i] = max(ans[i], ans[i+1]); } for(int i=1; i<=n; i++){ cout << ans[i] << " "; } } int main(){ int a[] = {10, 20, 30, 50, 10, 70, 30}; int n = sizeof(a)/sizeof(a[0]); printMaxOfMin(a, n); return 0; }
70 30 20 10 10 10 10
Java Program
import java.util.Stack; class MaxOfMin{ static int a[] = {10, 20, 30, 50, 10, 70, 30}; static void printMaxOfMin(int n){ Stack<Integer> s = new Stack<>(); int left[] = new int[n+1]; int right[] = new int[n+1]; for(int i=0; i<n; i++){ left[i] = -1; right[i] = n; } for(int i=0; i<n; i++){ while(!s.empty() && a[s.peek()] >= a[i]){ s.pop(); } if(!s.empty()){ left[i] = s.peek(); } s.push(i); } while(!s.empty()){ s.pop(); } for(int i = n-1 ; i>=0 ; i--){ while(!s.empty() && a[s.peek()] >= a[i]){ s.pop(); } if(!s.empty()){ right[i] = s.peek(); } s.push(i); } int ans[] = new int[n+1]; for(int i=0; i<=n; i++){ ans[i] = 0; } for(int i=0; i<n; i++){ int len = right[i] - left[i] - 1; ans[len] = Math.max(ans[len], a[i]); } for(int i=n-1; i>=1; i--){ ans[i] = Math.max(ans[i], ans[i+1]); } for(int i=1; i<=n; i++){ System.out.print(ans[i] + " "); } } public static void main(String[] args){ printMaxOfMin(a.length); } }
70 30 20 10 10 10 10
Complexity Analysis for Find Maximum of Minimum for Every Window Size
Time Complexity: O(n) where n is the number of elements in the given array a[ ].
Auxiliary Space: O(n) because we used stack space for n elements.