Sliding Window Programming

About

Sliding Window is a powerful and commonly used technique for solving problems related to arrays or strings, especially when we are dealing with contiguous (continuous) subarrays or substrings.

The basic idea is:

  • Instead of checking every possible subarray (which takes a lot of time), we move a window (a part of the array) across the input.

  • We slide this window by moving its start and end pointers, depending on the problem.

This approach helps us reduce time complexity from O(n²) to O(n) in many cases.

Why Use Sliding Window ?

Sliding Window is useful when:

  • We need to find or calculate something in a subarray or substring of fixed or variable length.

  • Problems require efficient scanning over a portion of the input while keeping track of some condition (like sum, frequency, count, etc.)

It avoids recomputing results from scratch for every subarray and instead updates the result as the window moves.

How It Works ?

There are two types of sliding windows:

1. Fixed Size Window

  • The window size is known and does not change.

  • Example: Find the maximum sum of any subarray of size k.

Steps:

  • Start with a window of size k.

  • Move the window one step at a time (i.e., shift both start and end pointers).

  • Update the result (sum, max, etc.) by subtracting the outgoing element and adding the new incoming element.

2. Variable Size Window

  • The window size changes depending on some condition (like sum ≤ K, all unique characters, etc.)

  • Example: Find the longest substring with no repeating characters.

Steps:

  • Expand the window by moving the end pointer.

  • If the condition breaks, move the start pointer to shrink the window.

  • Keep updating the result based on the current valid window.

Use Case 1: Maximum Sum of Subarray of Size K

Given an array of integers and a number k, find the maximum sum of any contiguous subarray of size k.

Example

Input:

arr = [2, 1, 5, 1, 3, 2], k = 3

Output:

9

Explanation:

  • Subarrays of size 3:

    • [2, 1, 5] → sum = 8

    • [1, 5, 1] → sum = 7

    • [5, 1, 3] → sum = 9 ← max

    • [1, 3, 2] → sum = 6

  • Maximum sum is 9

Brute Force (O(n²)) Approach

Generate all subarrays of size k, calculate the sum, and find the maximum.

int maxSum = Integer.MIN_VALUE;

for (int i = 0; i <= arr.length - k; i++) {
    int sum = 0;
    for (int j = i; j < i + k; j++) {
        sum += arr[j];  // Add each element in the window
    }
    maxSum = Math.max(maxSum, sum);
}
System.out.println(maxSum);

Time Complexity

  • Outer loop runs (n - k + 1) times

  • Inner loop runs k times

  • Total = O((n - k + 1) * k) = O(n * k)

  • If k ≈ n, this becomes O(n²)

Optimized Sliding Window (O(n)) Approach

Use a window of size k. Instead of recalculating the sum every time:

  • Subtract the element that’s leaving the window

  • Add the element that’s entering the window

int maxSum = 0;
int windowSum = 0;

// Step 1: Calculate sum of first window
for (int i = 0; i < k; i++) {
    windowSum += arr[i];
}
maxSum = windowSum;

// Step 2: Slide the window
for (int i = k; i < arr.length; i++) {
    windowSum += arr[i] - arr[i - k];  // Add new, remove old
    maxSum = Math.max(maxSum, windowSum);
}

System.out.println(maxSum);

Step-by-Step Example

Array = [2, 1, 5, 1, 3, 2], k = 3

  • First window [2, 1, 5] → sum = 8

  • Slide to [1, 5, 1] → sum = 8 - 2 + 1 = 7

  • Slide to [5, 1, 3] → sum = 7 - 1 + 3 = 9 ← max

  • Slide to [1, 3, 2] → sum = 9 - 5 + 2 = 6

Final result = 9

Time Complexity

  • One full pass through array → O(n)

Last updated