Бесплатная бета: 30 дней полного доступа, без карты.Зарегистрироваться бесплатно

Мы используем необходимые куки для работы сайта (вход и язык). Формы обратной связи и сообщения об ошибке дополнительно используют Google reCAPTCHA для защиты от спама. Она загружается только если вы согласитесь. Политика конфиденциальности

Полевой справочник

Скользящее окно (фиксированный размер)

O(n)

Держать окно ровно из k элементов и сдвигать его на шаг за раз: добавлять входящий элемент, убирать выходящий и обновлять текущий ответ без пересчёта всего окна.

Сигналы

непрерывный подмассив/подстрока заданной длины kкаждое окно размера kскользящее среднее или скользящая суммамин/макс/количество/сумма по каждому фиксированному отрезку

Шаблон

function windowStat(arr, k) {
    let windowSum = 0;
    for (let i = 0; i < k; i++) windowSum += arr[i];
    let best = windowSum;
    for (let i = k; i < arr.length; i++) {
        windowSum += arr[i] - arr[i - k];
        best = Math.max(best, windowSum);
    }
    return best;
}

Похоже, но не то

  • Скользящее окно переменного размера: Фиксированное окно на всём проходе имеет размер ровно k и никогда не растёт и не сужается. У переменного окна нет фиксированного k: оно само растёт и сужается в зависимости от того, выполняется ли условие.
  • Префиксные суммы: Префиксные суммы считаются один раз заранее, чтобы потом за O(1) отвечать на ЛЮБОЙ произвольный диапазон. Фиксированное окно катит один отрезок размера k вперёд и отвечает только про этот один движущийся отрезок.

n до 1e5..1e6 -> O(n): каждый элемент входит в окно и выходит из него ровно один раз, поэтому сдвиг это один линейный проход, а не O(nk) с пересчётом.

Изучить этот паттерн