Карта / Решение задач / Скользящее окно

Скользящее окно

Скользящее окно (sliding window) — приём для задач про “непрерывный кусок (подмассив/подстроку) с каким-то свойством”. Вместо пересчёта окна с нуля на каждом шаге, окно просто сдвигается: убирает один элемент слева, добавляет один справа.

Классическая задача: «максимальная сумма подмассива длины k»:

int maxSumWindow(int[] arr, int k) {
    int windowSum = 0;
    for (int i = 0; i < k; i++) windowSum += arr[i];   // первое окно — считаем целиком

    int maxSum = windowSum;
    for (int i = k; i < arr.length; i++) {
        windowSum += arr[i] - arr[i - k];   // сдвиг: + новый элемент, − ушедший
        maxSum = Math.max(maxSum, windowSum);
    }
    return maxSum;
}
2 5 1 8 окно: [2,5,1] sum=8 2 5 1 +8, окно: [5,1,8] sum=14
Копнуть глубже

Без скользящего окна наивное решение пересчитывало бы сумму каждого окна с нуля — O(n × k). Скользящее окно переиспользует уже посчитанную сумму предыдущего окна, добавляя/убирая по одному элементу — это сводит решение к O(n).

Окно переменного размера — вторая частая разновидность: окно растёт, пока выполняется условие, и сжимается, когда условие нарушается (например: «самая длинная подстрока без повторяющихся символов»). Признак задачи под скользящее окно — слова «непрерывный», «подмассив/подстрока», «максимум/минимум при фиксированном/переменном размере окна».

🎤 Закрыл тему, если можешь объяснить:
• идею скользящего окна и почему это быстрее пересчёта с нуля;
• разницу между окном фиксированного и переменного размера (если дошёл до 2-го слоя).