DDSA Solutions

K Sized Subarray Maximum

Time: O(n)
Space: O(k)
Advertisement

Intuition

Sliding window maximum. Monotone deque maintains candidates for maximum in decreasing order.

Algorithm

  1. 1Deque of indices (decreasing values). For each element: remove indices out of window from front. Remove elements smaller than current from back. Add current index.
  2. 2Front of deque is max of current window.

Common Pitfalls

  • Remove from front if index out of window range. Deque stores indices, not values.
K Sized Subarray Maximum.java
Java
// Approach: Monotonic deque. Maintain decreasing deque of indices; front is max of current window.
// Time: O(n) Space: O(k)
import java.util.*;

class Solution {
    // Function to find maximum of each subarray of size k.
    public ArrayList<Integer> max_of_subarrays(int k, int arr[]) {
        ArrayList<Integer> result = new ArrayList<>();
        Deque<Integer> deque = new LinkedList<>();

        for (int i = 0; i < k; i++) {
            while (!deque.isEmpty() && arr[i] >= arr[deque.peekLast()])
                deque.removeLast();

            deque.addLast(i);
        }

        for (int i = k; i < arr.length; i++) {
            result.add(arr[deque.peek()]);

            while (!deque.isEmpty() && deque.peek() <= i - k)
                deque.removeFirst();

            while (!deque.isEmpty() && arr[i] >= arr[deque.peekLast()])
                deque.removeLast();

            deque.addLast(i);
        }

        result.add(arr[deque.peek()]);

        return result;
    }
}
Advertisement
Was this solution helpful?