Sliding Window áp dụng khi cần duyệt mọi đoạn liên tiếp (subarray/substring) thoả điều kiện, tránh O(n·k) bằng cách trượt cửa sổ trong O(n).
Fixed-size: độ dài cửa sổ K cố định. Ví dụ "tổng lớn nhất của K phần tử liên tiếp".
Variable-size: độ dài cửa sổ thay đổi theo điều kiện. Ví dụ "đoạn dài nhất không có ký tự lặp". Thường có 2 con trỏ left và right — mở rộng right rồi co left khi vi phạm điều kiện.
Pattern chung:
ts
let left = 0
for (let right = 0; right < nums.length; right++) {
// mở rộng cửa sổ với nums[right]
while (/* vi phạm điều kiện */) {
// co cửa sổ: gỡ nums[left], left++
}
// cập nhật answer
}Mỗi phần tử visit tối đa 2 lần → O(n).