Sliding window is one of the most important patterns for FAANG interviews. It appears in 15-20% of array/string problems, and once you master it, you'll solve entire categories of problems in minutes instead of hours.
But here's the problem: most beginners practice in the wrong order. They jump straight to "Minimum Window Substring" (LeetCode Hard) without understanding the fundamentals. They memorize solutions instead of building intuition. They give up because the pattern feels like "magic."
This roadmap fixes that. I'll show you the exact progression: fundamentals → intuition → mastery. You'll learn which problems to practice, in what order, and why each one matters. By the end, sliding window won't feel like magic—it'll feel obvious.
This guide includes:
- 30 curated problems organized into 3 progressive phases
- Direct LeetCode links for every problem
- Problem-specific explanations of what each teaches you
- Templates and visualizations to build muscle memory
- A downloadable checklist to track your progress
Let's build your sliding window mastery from the ground up.
TL;DR — Your Sliding Window Learning Path
- Phase 1 (5 problems): Learn fixed-size vs variable-size windows, expand/shrink mechanics, and basic invariants
- Phase 2 (10 problems): Master frequency maps, validity conditions, and aggressive shrinking
- Phase 3 (15 problems): Handle complex constraints, mix with other data structures, and solve interview-level problems
- Total time: 3-4 weeks at 1-2 problems per day
- Prerequisites: Basic array/string manipulation, hash maps, two pointers
- Success metric: Can identify and solve sliding window problems in 15-20 minutes
- Pro tip: Don't skip Phase 1. The fundamentals are everything.
Why You Need a Sliding Window Roadmap
Too Many Problems, No Clear Order
LeetCode has 200+ sliding window problems. Which ones should you practice? In what order? Most people either:
- Practice randomly and miss fundamental patterns
- Follow "Top Interview Questions" lists that skip the basics
- Get stuck on hard problems and lose motivation
A roadmap solves this. You'll practice in a deliberate sequence that builds on previous knowledge.
Hard to Identify Sliding Window vs Two Pointers
Beginners confuse sliding window with two pointers. They're related but different:
- Two Pointers: Pointers can move independently (e.g., "Two Sum II")
- Sliding Window: Maintains a contiguous range (e.g., "Longest Substring Without Repeating Characters")
This roadmap teaches you the distinction through carefully chosen problems.
The Pattern Feels "Magic" Until You See the Progression
When you see an expert solve "Minimum Window Substring" in 10 minutes, it looks like magic. But they're not smarter—they've seen the progression:
- Fixed-size windows (easiest)
- Variable-size with simple conditions
- Variable-size with frequency maps
- Complex constraints with multiple data structures
Each step builds on the last. This roadmap shows you that progression.
Practicing in the Wrong Order Leads to Confusion
If you start with hard problems, you'll memorize solutions without understanding. If you start too easy, you'll get bored. This roadmap balances challenge and learning at every phase.
The 3-Phase Sliding Window Learning Path
Phase 1 — Core Basics (5 Essential Problems)
Goal: Understand fixed-size vs variable-size windows, how expand/shrink works, and how to maintain invariants.
Time Commitment: 3-5 days (1 problem per day)
Problem Set (Beginner Tier)
| # | Problem | Link | Type | Why It's Here |
|---|---|---|---|---|
| 1 | Maximum Sum Subarray of Size K | Practice on GFG | Fixed-size | Easiest entry point—teaches window sliding mechanics |
| 2 | Max Consecutive Ones III | LC 1004 | Variable | Perfect intro to shrinking when invalid |
| 3 | Longest Substring Without Repeating Characters | LC 3 | Variable | Most classic intro—teaches set-based tracking |
| 4 | Fruits Into Baskets | LC 904 | Variable w/ counters | Practicing distinct counter logic |
| 5 | Maximum Average Subarray I | LC 643 | Fixed-size | Reinforces moving window logic |
What You Should Learn in Phase 1
1. The Expand-Shrink Pattern
Every sliding window problem follows this template:
left = 0
for right in range(len(arr)):
# Expand: Add arr[right] to window
while window_is_invalid():
# Shrink: Remove arr[left] from window
left += 1
# Update answer2. Fixed-Size vs Variable-Size
- Fixed-size: Window size is constant (e.g., "size K"). You slide the entire window.
- Variable-size: Window size changes based on a condition (e.g., "at most K distinct"). You expand right, shrink left.
3. Tracking Window State
You need to track:
- What's in the window (set, map, counter)
- Whether the window is valid (condition check)
- The best answer so far (max, min, count)
Practice Tip: After solving each problem, rewrite the solution from memory. This builds muscle memory.
Next Step: Before moving to Phase 2, review the Sliding Window Template Explained to solidify your understanding.
Phase 2 — Intermediate Mastery (10 Core Problems)
Goal: Strengthen intuition, recognize patterns, handle frequency maps and conditions.
Time Commitment: 10-14 days (1 problem per day)
Problem Set (Intermediate Tier)
| # | Problem | Link | Type | Key Skill |
|---|---|---|---|---|
| 6 | Longest Substring with At Most K Distinct Characters | LC 340 | Variable | Classic "at most" constraint |
| 7 | Longest Repeating Character Replacement | LC 424 | Variable | Window validity condition |
| 8 | Binary Subarrays With Sum | LC 930 | Prefix + Window | Advanced counting |
| 9 | Subarrays With K Different Integers | LC 992 | Two-window trick | "Exactly K" technique |
| 10 | Minimum Size Subarray Sum | LC 209 | Shrinking | Teaches aggressive shrinking |
| 11 | Longest Substring with At Most Two Distinct Characters | LC 159 | Variable | Variation of "Fruits Into Baskets" |
| 12 | Permutation in String | LC 567 | Fixed freq map | Anagram window |
| 13 | Find All Anagrams in a String | LC 438 | Fixed freq map | Pattern matching |
| 14 | Grumpy Bookstore Owner | LC 1052 | Fixed-size | Creative application |
| 15 | Longest Continuous Subarray With Absolute Diff ≤ Limit | LC 1438 | Window + monotonic deque | Industrial-grade version |
What You Should Learn in Phase 2
1. How to Maintain Frequency Maps
Many problems require tracking character/element counts:
from collections import defaultdict
freq = defaultdict(int)
left = 0
for right in range(len(s)):
freq[s[right]] += 1
while len(freq) > k: # Too many distinct characters
freq[s[left]] -= 1
if freq[s[left]] == 0:
del freq[s[left]]
left += 12. How to Test Validity Efficiently
The condition while window_is_invalid() varies by problem:
- "At most K distinct":
len(freq) > k - "At most K flips":
zero_count > k - "Sum ≥ target":
current_sum >= target
3. How to Shrink Aggressively
In "Minimum Size Subarray Sum", you shrink as much as possible while maintaining validity:
while current_sum >= target:
min_len = min(min_len, right - left + 1)
current_sum -= nums[left]
left += 14. Recognizing When Sliding Window Applies
Sliding window works when:
- You need a contiguous subarray/substring
- You're optimizing (max/min length, count)
- The problem has a monotonic property (adding elements makes condition "worse" or "better")
Practice Tip: For each problem, write down the invariant (what makes the window valid) before coding.
Checkpoint: If Phase 2 feels too hard, revisit Sliding Window Intuition Explained to strengthen your mental model.
Phase 3 — Advanced & Real Interview Problems (15 Problems)
Goal: Master tricky conditions, mixing data structures, and edge-case handling.
Time Commitment: 15-20 days (1 problem per day, some require multiple attempts)
Problem Set (Advanced Tier)
| # | Problem | Link | Type | Why It's Advanced |
|---|---|---|---|---|
| 16 | Minimum Window Substring | LC 76 | Hard | Most famous sliding window—requires frequency matching |
| 17 | Sliding Window Maximum | LC 239 | Window + deque | Mix of DS + window |
| 18 | Count Subarrays With Fixed Bounds | LC 2444 | Hard | "Two-window" trick |
| 19 | Count Number of Nice Subarrays | LC 1248 | Medium | "Exactly K" logic |
| 20 | Longest Substring with At Least K Repeating Characters | LC 395 | Medium | Divide and conquer + window |
| 21 | Max Consecutive Ones II | LC 487 | Medium | Variation of LC 1004 |
| 22 | Substring with Concatenation of All Words | LC 30 | Hard | Complex window—requires multiple pointers |
| 23 | Minimum Number of K Consecutive Bit Flips | LC 995 | Hard | Window w/ flipping logic |
| 24 | Find K-Length Substrings With No Repeated Characters | LC 1100 | Medium | Pattern recognition |
| 25 | Maximum Erasure Value | LC 1695 | Medium | Set window with sum tracking |
| 26 | Frequency of the Most Frequent Element | LC 1838 | Medium | Sorting + sliding window |
| 27 | Longest Nice Subarray | LC 2401 | Medium | Bitwise operations + window |
| 28 | Number of Substrings Containing All Three Characters | LC 1358 | Medium | Counting subarrays |
| 29 | Replace the Substring for Balanced String | LC 1234 | Medium | Reverse thinking—find minimum to change |
| 30 | Minimum Window Subsequence | LC 727 | Hard | Subsequence (not subarray)—advanced variation |
What You Should Learn in Phase 3
1. How to Mix Window with Other Data Structures
Sliding Window Maximum (LC 239) uses a monotonic deque:
from collections import deque
def maxSlidingWindow(nums, k):
dq = deque() # Stores indices
result = []
for i in range(len(nums)):
# Remove elements outside window
while dq and dq[0] < i - k + 1:
dq.popleft()
# Remove smaller elements (they'll never be max)
while dq and nums[dq[-1]] < nums[i]:
dq.pop()
dq.append(i)
if i >= k - 1:
result.append(nums[dq[0]])
return result2. Edge-Case Heavy Questions
Advanced problems test:
- Empty arrays/strings
- Single-element inputs
- All elements the same
- No valid window exists
3. Multi-Window Technique
Subarrays With K Different Integers (LC 992) uses a trick:
exactly(K) = atMost(K) - atMost(K-1)You solve two sliding window problems and subtract.
4. When Sliding Window Breaks
Not every contiguous subarray problem is sliding window. If:
- You need to consider all subarrays (not just optimal)
- The problem requires backtracking or DP
- There's no monotonic property
Then consider other patterns (prefix sum, DP, divide and conquer).
Practice Tip: For hard problems, spend 30 minutes trying yourself, then read one hint, try again, then look at the solution. Don't just copy code.
Advanced Resource: Check out our Top Sliding Window Problems Ranked for more challenging variations.
Visualization & Templates
Sliding Window Template
Here's the universal template that works for 90% of problems:
def sliding_window(arr, k):
left = 0
window_state = {} # Could be set, dict, counter, etc.
result = 0 # Or float('inf'), [], etc.
for right in range(len(arr)):
# 1. Expand: Add arr[right] to window
# Update window_state
# 2. Shrink: While window is invalid
while window_is_invalid(window_state, k):
# Remove arr[left] from window
# Update window_state
left += 1
# 3. Update result
result = max(result, right - left + 1) # Or other logic
return resultKey Variables:
left: Left boundary of windowright: Right boundary of window (loop variable)window_state: Tracks what's in the windowresult: Best answer found so far
Customization Points:
- window_state: Set (for distinct elements), dict (for frequencies), int (for count)
- window_is_invalid: Problem-specific condition
- result update: Max length, min length, count, etc.
Interactive Learning: Use our Sliding Window Visualizer to see this template in action on real problems.
Debugging Guide
Common Bugs:
Forgetting to shrink: You expand but never shrink
- Fix: Always have a
whileloop for shrinking
- Fix: Always have a
Off-by-one in window size:
right - leftinstead ofright - left + 1- Fix: Window size is always
right - left + 1
- Fix: Window size is always
Not updating state on shrink: You move
leftbut don't updatewindow_state- Fix: Always update state when adding/removing elements
Using
ifinstead ofwhilefor shrinking: Window can become invalid by more than one element- Fix: Use
whileto shrink until valid
- Fix: Use
Deep Dive: Read our Common Sliding Window Mistakes article for more debugging tips.
Full 30-Problem Sliding Window Practice List
Here's your complete checklist. Copy this to track your progress:
Phase 1: Core Basics
[ ] 1. Maximum Sum Subarray of Size K
[ ] 2. Max Consecutive Ones III (LC 1004)
[ ] 3. Longest Substring Without Repeating Characters (LC 3)
[ ] 4. Fruits Into Baskets (LC 904)
[ ] 5. Maximum Average Subarray I (LC 643)
Phase 2: Intermediate Mastery
[ ] 6. Longest Substring with At Most K Distinct Characters (LC 340)
[ ] 7. Longest Repeating Character Replacement (LC 424)
[ ] 8. Binary Subarrays With Sum (LC 930)
[ ] 9. Subarrays With K Different Integers (LC 992)
[ ] 10. Minimum Size Subarray Sum (LC 209)
[ ] 11. Longest Substring with At Most Two Distinct Characters (LC 159)
[ ] 12. Permutation in String (LC 567)
[ ] 13. Find All Anagrams in a String (LC 438)
[ ] 14. Grumpy Bookstore Owner (LC 1052)
[ ] 15. Longest Continuous Subarray With Absolute Diff ≤ Limit (LC 1438)
Phase 3: Advanced & Interview Problems
[ ] 16. Minimum Window Substring (LC 76)
[ ] 17. Sliding Window Maximum (LC 239)
[ ] 18. Count Subarrays With Fixed Bounds (LC 2444)
[ ] 19. Count Number of Nice Subarrays (LC 1248)
[ ] 20. Longest Substring with At Least K Repeating Characters (LC 395)
[ ] 21. Max Consecutive Ones II (LC 487)
[ ] 22. Substring with Concatenation of All Words (LC 30)
[ ] 23. Minimum Number of K Consecutive Bit Flips (LC 995)
[ ] 24. Find K-Length Substrings With No Repeated Characters (LC 1100)
[ ] 25. Maximum Erasure Value (LC 1695)
[ ] 26. Frequency of the Most Frequent Element (LC 1838)
[ ] 27. Longest Nice Subarray (LC 2401)
[ ] 28. Number of Substrings Containing All Three Characters (LC 1358)
[ ] 29. Replace the Substring for Balanced String (LC 1234)
[ ] 30. Minimum Window Subsequence (LC 727)Progress Tracking Tips:
- ✅ Mark complete only if you can solve without hints
- 🔄 Revisit problems you struggled with after 1 week
- ⭐ Star problems that taught you something new
- 📝 Write down the key insight for each problem
Final Tips for Mastering Sliding Window
Pattern First, Problems Second
Don't just solve problems—understand the pattern. After each problem, ask:
- What made this a sliding window problem?
- What was the invariant (window validity condition)?
- Could I recognize this pattern in a new problem?
Build Your Own Template
The template I provided is a starting point. As you solve more problems, customize it:
- Add comments for your common mistakes
- Create variants for fixed-size vs variable-size
- Include your favorite debugging print statements
Practice Until Intuition Clicks
You'll know you've mastered sliding window when:
- You can identify it in 30 seconds
- You can write the template from memory
- You know which data structure to use (set, map, deque) instantly
This takes 20-30 problems. Don't rush.
Revisit Hard Problems After a Week
If you struggled with a problem, revisit it after 7 days. If you can solve it without hints, you've truly learned it.
Track Your Progress
Use a spreadsheet or the checklist above. Seeing your progress is motivating.
Pro Tip: Use LeetCopilot's pattern-based learning to practice sliding window alongside other patterns. Interleaving patterns improves retention.
Related Patterns to Study
Sliding window doesn't exist in isolation. Study these related patterns:
- Two Pointers: Similar mechanics, different use cases
- Prefix Sum: Often combined with sliding window
- Monotonic Stack/Deque: Used in advanced sliding window problems
- Hash Map: Essential for frequency-based windows
FAQ
Q: How long does it take to master sliding window?
A: 3-4 weeks if you practice 1-2 problems per day. Rushing through in a week won't build intuition.
Q: Should I do all 30 problems in order?
A: Yes, especially Phase 1 and 2. Phase 3 can be done in any order, but don't skip to Phase 3 without mastering Phase 2.
Q: What if I get stuck on a problem?
A: Spend 30 minutes trying. Then read one hint. Try again for 15 minutes. Then look at the solution and understand every line.
Q: Do I need to memorize the template?
A: Yes. Write it from memory 5-10 times until it's automatic. The template is your foundation.
Q: Can I skip Phase 1 if I already know sliding window?
A: Only if you can solve all Phase 1 problems in under 10 minutes each without hints. Otherwise, start from Phase 1.
Q: What's the difference between "at most K" and "exactly K"?
A: "At most K" is a single sliding window. "Exactly K" requires the trick: exactly(K) = atMost(K) - atMost(K-1).
Q: How do I know if a problem is sliding window or two pointers?
A: Sliding window maintains a contiguous range and optimizes it. Two pointers can move independently (e.g., one at start, one at end).
Q: Should I practice on LeetCode or other platforms?
A: LeetCode is best for interview prep. The problems in this roadmap are all on LeetCode (or equivalent).
Q: What if I can't solve a problem after looking at the solution?
A: That's normal. Implement the solution, then solve 2-3 similar problems. Come back to the hard one after a week.
Q: Is sliding window enough for FAANG interviews?
A: No. It's one of 15-20 core patterns. But mastering it gives you a huge advantage on 15-20% of problems.
Want to Practice LeetCode Smarter?
LeetCopilot is a free browser extension that enhances your LeetCode practice with AI-powered hints, personalized study notes, and realistic mock interviews — all designed to accelerate your coding interview preparation.
Also compatible with Edge, Brave, and Opera
