PassFront
  1. PassFront
  2. База знаний
  3. Рекурсия, жадные алгоритмы и ДП

Что такое метод двух указателей и скользящее окно?

Рекурсия, жадные алгоритмы и ДП

Два указателя и скользящее окно — приёмы обработки массивов и строк за O(n): указатели движутся только вперёд, и каждый элемент обрабатывается константное число раз.

Два указателя

  • С противоположных концов: пара с заданной суммой в отсортированном массиве, проверка палиндрома.
  • Быстрый и медленный: удаление дубликатов in-place, поиск цикла в списке (алгоритм Флойда).

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

Окно [left, right] расширяется вправо, пока условие выполняется, и сжимается слева, когда оно нарушается:

const longestUnique = (s) => {
  const seen = new Set();
  let left = 0, best = 0;
  for (let right = 0; right < s.length; right++) {
    while (seen.has(s[right])) seen.delete(s[left++]); // сжимаем слева
    seen.add(s[right]); // расширяем вправо
    best = Math.max(best, right - left + 1);
  }
  return best;
};

Классика: самая длинная подстрока без повторов, максимальная сумма подмассива длины k.

Почему это O(n)

Каждый указатель проходит массив один раз — суммарно не больше 2n операций.

Коротко для собеседования

Указатели движутся только вперёд, поэтому задачи на подотрезки решаются за O(n) без перебора пар. Приём требует монотонного условия окна: с отрицательными числами окно на сумму ломается, и берут префиксные суммы.

Другие вопросы раздела