Скользящее окно
Скользящее окно (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;
}
Копнуть глубже
Без скользящего окна наивное решение пересчитывало бы сумму каждого окна с нуля — O(n × k). Скользящее окно переиспользует уже посчитанную сумму предыдущего окна, добавляя/убирая по одному элементу — это сводит решение к O(n).
Окно переменного размера — вторая частая разновидность: окно растёт, пока выполняется условие, и сжимается, когда условие нарушается (например: «самая длинная подстрока без повторяющихся символов»). Признак задачи под скользящее окно — слова «непрерывный», «подмассив/подстрока», «максимум/минимум при фиксированном/переменном размере окна».
• разницу между окном фиксированного и переменного размера (если дошёл до 2-го слоя).