DEV Community

Jaspreet singh
Jaspreet singh

Posted on

Max of min for every window size

Problem Statement

Given an array of size N, for every window size from:

1 → N
Enter fullscreen mode Exit fullscreen mode

find:

Maximum of all minimum elements
Enter fullscreen mode Exit fullscreen mode

for that window size.


Brute Force Intuition

In an interview, you can explain it like this:

For every possible window size, generate all windows. Compute the minimum of each window and keep track of the maximum among those minimums.

This repeatedly computes minimums for overlapping windows.

Complexity

  • Time Complexity: O(N³)
  • Space Complexity: O(1)

Brute Force Code

class Solution {

    public int[] maxOfMin(int[] arr) {

        int n = arr.length;

        int[] ans = new int[n];

        for (int k = 1; k <= n; k++) {

            int best = Integer.MIN_VALUE;

            for (int i = 0; i <= n - k; i++) {

                int min = Integer.MAX_VALUE;

                for (int j = i; j < i + k; j++) {

                    min = Math.min(min, arr[j]);
                }

                best = Math.max(best, min);
            }

            ans[k - 1] = best;
        }

        return ans;
    }
}
Enter fullscreen mode Exit fullscreen mode

Moving Towards the Optimal Approach

Instead of checking every window,

ask a different question.

For every element:

In how many window sizes
can this element be
the minimum?
Enter fullscreen mode Exit fullscreen mode

If we know that,

we can directly update the answer.


Pattern Recognition

Whenever you see:

  • Previous Smaller
  • Next Smaller
  • Range where an element dominates

Think:

Monotonic Stack


Key Observation

Suppose:

Array

10 20 30 50 10 70 30
Enter fullscreen mode Exit fullscreen mode

Take:

30
Enter fullscreen mode Exit fullscreen mode

Find:

Previous Smaller

↓

Next Smaller
Enter fullscreen mode Exit fullscreen mode

These two indices tell us:

Maximum window size
where 30 remains
the minimum element.
Enter fullscreen mode Exit fullscreen mode

Window Length:

length = nextSmaller
       - prevSmaller
       - 1;
Enter fullscreen mode Exit fullscreen mode

Now simply update:

answer[length]
=
max(answer[length],30);
Enter fullscreen mode Exit fullscreen mode

Optimal Approach

Step 1

Find:

Previous Smaller Index
Enter fullscreen mode Exit fullscreen mode

Step 2

Find:

Next Smaller Index
Enter fullscreen mode Exit fullscreen mode

Step 3

For every element:

length = right - left - 1
Enter fullscreen mode Exit fullscreen mode

Update:

ans[length]
Enter fullscreen mode Exit fullscreen mode

Step 4

Some window sizes may remain empty.

Fill them from right to left:

ans[i] = Math.max(ans[i],
                  ans[i+1]);
Enter fullscreen mode Exit fullscreen mode

Optimal Java Solution

class Solution {

    public int[] maxOfMin(int[] arr) {

        int n = arr.length;

        int[] left = new int[n];
        int[] right = new int[n];

        Stack<Integer> st = new Stack<>();

        // Previous Smaller
        for (int i = 0; i < n; i++) {

            while (!st.isEmpty() &&
                   arr[st.peek()] >= arr[i]) {

                st.pop();
            }

            left[i] =
                st.isEmpty() ? -1 : st.peek();

            st.push(i);
        }

        st.clear();

        // Next Smaller
        for (int i = n - 1; i >= 0; i--) {

            while (!st.isEmpty() &&
                   arr[st.peek()] >= arr[i]) {

                st.pop();
            }

            right[i] =
                st.isEmpty() ? n : st.peek();

            st.push(i);
        }

        int[] ans = new int[n + 1];

        Arrays.fill(ans, Integer.MIN_VALUE);

        for (int i = 0; i < n; i++) {

            int len =
                right[i] - left[i] - 1;

            ans[len] =
                Math.max(ans[len], arr[i]);
        }

        for (int i = n - 1; i >= 1; i--) {

            ans[i] =
                Math.max(ans[i], ans[i + 1]);
        }

        return Arrays.copyOfRange(ans, 1, n + 1);
    }
}
Enter fullscreen mode Exit fullscreen mode

Dry Run

Input

arr = [10,20,30,50,10,70,30]
Enter fullscreen mode Exit fullscreen mode

Previous Smaller

-1

0

1

2

-1

4

4
Enter fullscreen mode Exit fullscreen mode

Next Smaller

7

4

4

4

7

6

7
Enter fullscreen mode Exit fullscreen mode

Window Lengths

For:

50
Enter fullscreen mode Exit fullscreen mode

Window:

4 - 2 - 1

= 1
Enter fullscreen mode Exit fullscreen mode

Update:

ans[1] = 50
Enter fullscreen mode Exit fullscreen mode

For:

30
Enter fullscreen mode Exit fullscreen mode

Window:

4 - 1 - 1

= 2
Enter fullscreen mode Exit fullscreen mode

Update:

ans[2] = 30
Enter fullscreen mode Exit fullscreen mode

Continue similarly.


Final Answer

70 30 20 10 10 10 10
Enter fullscreen mode Exit fullscreen mode

Why Monotonic Stack Works?

Every element is:

Pushed Once

Popped Once
Enter fullscreen mode Exit fullscreen mode

The stack efficiently finds the previous and next smaller elements.

From these boundaries, we know exactly the largest window where an element is the minimum.


Complexity Analysis

Metric Complexity
Time Complexity O(N)
Space Complexity O(N)

Interview One-Liner

Compute the previous and next smaller indices for every element to determine the largest window where it is the minimum, then update the answer for that window size.


Pattern Learned

Previous Smaller

+

Next Smaller

↓

Window Length

↓

Monotonic Stack
Enter fullscreen mode Exit fullscreen mode

Similar Problems

  • Maximum of Minimum for Every Window Size
  • Largest Rectangle in Histogram
  • Sum of Subarray Minimums
  • Next Smaller Element
  • Previous Smaller Element

Memory Trick

Think:

Current Element

↓

Previous Smaller

↓

Next Smaller

↓

Largest Window

↓

Update Answer
Enter fullscreen mode Exit fullscreen mode

Mental Model

Element

↓

Acts as Minimum

↓

For One Window Length

↓

Store Best Value
Enter fullscreen mode Exit fullscreen mode

Whenever you hear:

"Maximum of minimums" or "Range where an element is minimum"

your brain should immediately think:

Previous Smaller + Next Smaller + Monotonic Stack

Top comments (0)