Skip to main content
Ajay Dhangar
EditReport

Sliding Window Algorithm

The Sliding Window technique is one of the most powerful patterns in DSA. It converts an O(nยฒ) brute-force approach into an elegant O(n) solution for problems involving contiguous subarrays or substrings.


๐Ÿง  Core Ideaโ€‹

Instead of recalculating from scratch for every subarray, we maintain a window and slide it across the array โ€” adding one element on the right and removing one on the left.

Array:  [ 2,  1,  5,  1,  3,  2 ]   K = 3

Window 1: [2, 1, 5] โ†’ sum = 8
โ†“ slide
Window 2: [1, 5, 1] โ†’ sum = 7 (remove 2, add 1)
โ†“ slide
Window 3: [5, 1, 3] โ†’ sum = 9 (remove 1, add 3) โ† MAX
โ†“ slide
Window 4: [1, 3, 2] โ†’ sum = 6 (remove 5, add 2)

๐Ÿ—‚๏ธ Types of Sliding Windowโ€‹

TypeWindow SizeUse When
Fixed WindowConstant (K)Problem gives a fixed size K
Variable WindowGrows & shrinksFind longest/shortest satisfying a condition

๐Ÿ”’ Type 1: Fixed Size Sliding Windowโ€‹

When to Useโ€‹

  • "Find max/min sum of subarray of size K"
  • "Find average of every subarray of size K"
  • The window size is given directly in the problem

Visual Diagramโ€‹

Problem: Max sum subarray of size K=3
Array = [2, 1, 5, 1, 3, 2]

STEP 1: Build first window
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 2 โ”‚ 1 โ”‚ 5 โ”‚ 1 3 2
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
sum = 8 max = 8

STEP 2: Slide โ†’ remove left, add right
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2 โ”‚ 1 โ”‚ 5 โ”‚ 1 โ”‚ 3 2
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
sum = 8 - 2 + 1 = 7 max = 8

STEP 3: Slide again
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2 1 โ”‚ 5 โ”‚ 1 โ”‚ 3 โ”‚ 2
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
sum = 7 - 1 + 3 = 9 max = 9 โœ…

STEP 4: Slide again
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2 1 5 โ”‚ 1 โ”‚ 3 โ”‚ 2 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
sum = 9 - 5 + 2 = 6 max = 9

Answer: 9

Code Templateโ€‹

def max_sum_subarray(arr, k):
n = len(arr)
if n < k:
return -1

# Step 1: Build first window
window_sum = sum(arr[:k])
max_sum = window_sum

# Step 2: Slide the window
for i in range(k, n):
window_sum += arr[i] # Add incoming element (right)
window_sum -= arr[i - k] # Remove outgoing element (left)
max_sum = max(max_sum, window_sum)

return max_sum

# Example
arr = [2, 1, 5, 1, 3, 2]
print(max_sum_subarray(arr, 3)) # Output: 9

Time Complexity: O(n) ย |ย  Space Complexity: O(1)


๐Ÿ”“ Type 2: Variable Size Sliding Windowโ€‹

When to Useโ€‹

  • "Find the longest substring/subarray satisfying a condition"
  • "Find the smallest subarray with sum โ‰ฅ target"
  • Window size is not fixed โ€” it expands and shrinks based on a condition

How it Worksโ€‹

Two pointers: LEFT and RIGHT
- RIGHT expands the window (moves forward always)
- LEFT shrinks the window (moves forward when condition is violated)

LEFT RIGHT
โ†“ โ†“
[ a b c d e f g ]
โ””โ”€โ”€โ”€windowโ”€โ”€โ”˜

Classic Problem: Longest Substring Without Repeating Charactersโ€‹

Input: s = "a b c a b c b b"
0 1 2 3 4 5 6 7

right=0: window="a" no repeat โ†’ length=1
right=1: window="ab" no repeat โ†’ length=2
right=2: window="abc" no repeat โ†’ length=3
right=3: 'a' REPEATS!
โ†’ shrink: remove s[left]='a', left=1
โ†’ window="bca" no repeat โ†’ length=3
right=4: 'b' REPEATS!
โ†’ shrink: remove s[left]='b', left=2
โ†’ window="cab" no repeat โ†’ length=3
right=5: 'c' REPEATS!
โ†’ shrink: remove s[left]='c', left=3
โ†’ window="abc" no repeat โ†’ length=3
right=6: 'b' REPEATS!
โ†’ shrink until valid: left=5
โ†’ window="cb" length=2
right=7: 'b' REPEATS!
โ†’ shrink: left=7
โ†’ window="b" length=1

โœ… Answer: 3 ("abc")

Code Templateโ€‹

def longest_substring_no_repeat(s):
char_map = {} # stores char โ†’ last seen index
left = 0
max_length = 0

for right in range(len(s)):
# If char is already in window, shrink from left
if s[right] in char_map and char_map[s[right]] >= left:
left = char_map[s[right]] + 1

# Update last seen position
char_map[s[right]] = right

# Update max length
max_length = max(max_length, right - left + 1)

return max_length

# Example
print(longest_substring_no_repeat("abcabcbb")) # Output: 3
print(longest_substring_no_repeat("pwwkew")) # Output: 3

Time Complexity: O(n) ย |ย  Space Complexity: O(k) where k = unique characters


โšก Brute Force vs Sliding Windowโ€‹

Problem: Max sum subarray of size K=3
Array = [2, 1, 5, 1, 3, 2]

โŒ BRUTE FORCE โ€” O(nยฒ)
Window [0..2]: 2+1+5 = 8 (3 additions)
Window [1..3]: 1+5+1 = 7 (3 additions)
Window [2..4]: 5+1+3 = 9 (3 additions)
Window [3..5]: 1+3+2 = 6 (3 additions)
Total: 12 operations

โœ… SLIDING WINDOW โ€” O(n)
Window [0..2]: 2+1+5 = 8 (3 additions for first window)
Window [1..3]: 8 - 2 + 1 = 7 (1 subtraction + 1 addition)
Window [2..4]: 7 - 1 + 3 = 9 (1 subtraction + 1 addition)
Window [3..5]: 9 - 5 + 2 = 6 (1 subtraction + 1 addition)
Total: 9 operations โœ… Faster!

๐Ÿ“Š Complexity Summaryโ€‹

Problem TypeTimeSpace
Fixed window (sum, avg)O(n)O(1)
Variable window (longest substring)O(n)O(k)
Variable window (smallest subarray)O(n)O(1)

โŒ Common Mistakesโ€‹

  1. Forgetting to shrink the window โ€” Always move left forward when your condition is violated.
  2. Using nested loops โ€” If you see O(nยฒ) on a subarray problem, think Sliding Window.
  3. Wrong window size formula โ€” Current window size is always right - left + 1.
  4. Not handling edge cases โ€” Empty array, K larger than array length.
  5. Reinitializing variables inside the loop โ€” max_sum, left should be declared outside.

๐Ÿ‹๏ธ Practice Problemsโ€‹

#ProblemTypeDifficulty
1Maximum Sum Subarray of Size KFixed๐ŸŸข Easy
2Average of Subarrays of Size KFixed๐ŸŸข Easy
3Longest Substring Without Repeating CharactersVariable๐ŸŸก Medium
4Minimum Size Subarray SumVariable๐ŸŸก Medium
5Fruits Into BasketsVariable๐ŸŸก Medium
6Longest Repeating Character ReplacementVariable๐ŸŸก Medium
7Permutation in StringFixed๐ŸŸก Medium
8Minimum Window SubstringVariable๐Ÿ”ด Hard
9Sliding Window MaximumFixed + Deque๐Ÿ”ด Hard

๐Ÿ”— Referencesโ€‹

Finished reading? Mark this topic as complete.