Слогер Создать блог
Разработка

Как освоить Two Pointers на LeetCode: разбор метода с примерами

Два указателя вместо вложенных циклов — как превратить O(n²) в O(n) и перестать бояться средних задач.

Первая встреча с LeetCode почти всегда выглядит одинаково: открываешь Two Sum, пишешь два вложенных цикла, отправляешь — и ловишь Time Limit Exceeded. Дальше хуже: на средних задачах вроде 3Sum или Container With Most Water всё тоже упирается в квадратичное решение. Выход не в том, чтобы выучить больше частных случаев, а в освоении одного паттерна — двух указателей.

Зачем он вообще нужен

Многие задачи просят найти пару, тройку или подмассив с определённым свойством. Брутфорс перебирает все комбинации и на больших входных данных просто не успевает. Two Pointers использует тот факт, что массив отсортирован (или его можно отсортировать), и за один шаг отбрасывает целый кусок невозможных вариантов.

Работает это как игра «горячо-холодно». Ставишь один указатель в начало, второй — в конец. Сумма слишком маленькая? Единственный способ её увеличить — сдвинуть левый указатель вправо. Слишком большая? Сдвигаешь правый влево. Каждый шаг даёт точную информацию, и ты никогда не возвращаешься к уже отброшенным состояниям.

Базовый приём на примере Two Sum II

Классическая задача: массив уже отсортирован, надо найти два числа, дающих target, и вернуть их индексы (с единицы).

def two_sum(numbers, target):
  left, right = 0, len(numbers)-1
  while left < right:
    current = numbers[left] + numbers[right]
    if current == target:
      return [left+1, right+1]
    elif current < target:
      left += 1
    else:
      right -= 1
  return []

Почему это работает: благодаря сортировке сдвиг левого указателя увеличивает сумму, сдвиг правого — уменьшает. Каждая итерация гарантированно исключает минимум один индекс, поэтому суммарно нужно не больше n шагов. Итог — O(n) времени и O(1) памяти вместо O(n²) и вложенных циклов.

Сравнение: брутфорс против двух указателей

БрутфорсДва указателя
ВремяO(n²)O(n)
ПамятьO(1), но иногда O(n) для hash mapO(1)
КодПроще, но падает на больших nЧуть сложнее, зато летает
ТребованиеЛюбой массивОтсортированный или сортируемый

Типичные ошибки

  1. Забыть отсортировать массив, если это не гарантировано условием. Сортировка добавляет O(n log n), но это всё равно лучше, чем O(n²).
  2. Двигать оба указателя одновременно. Нужно двигать только тот, который ведёт к цели. Иначе легко проскочить правильную пару.
  3. Ошибиться в условии цикла: писать left <= right. Когда указатели встретились, все осмысленные пары уже рассмотрены.
  4. После сортировки потерять исходные индексы. Если ответ требует индексы, сохраняй пары (значение, индекс) до сортировки.

Куда двигаться дальше

Два указателя — это не одна конкретная задача, а образ мышления. 3Sum сводится к фиксации одного элемента и применению двух указателей к остатку. Container With Most Water — указатели с берегов, двигается сторона с меньшей высотой. Remove Duplicates from Sorted Array — то же самое, но оба указателя идут в одну сторону. А скользящее окно на подмассивах с положительными числами — ближайший родственник этой идеи.

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

Возьми задачу с тегом Two Pointers на LeetCode. Прежде чем писать код, нарисуй массив на бумаге и спроси себя: что станет с суммой, если я подвину left? Что будет, если подвинуть right? Начни с Two Sum II, потом переходи к 3Sum, Container With Most Water и Remove Duplicates.

Когда освоишь движение навстречу друг другу, попробуй fast/slow указатели на связных списках — там та же логика, но с другой скоростью. Этот навык пригодится и на собеседованиях, и при чтении чужого кода: паттерн виден почти сразу, если знаешь, куда смотреть.

По материалам: career. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (0)

Войдите, чтобы комментировать.

Пока нет комментариев. Будьте первым.

Разработка

Как переписать личное портфолио с Angular 12 на Angular 22: разбор прыжка через десять версий

Личный сайт на Angular 12, продакшен на Angular 19 — и решение переписать всё сразу на 22. Что даёт чистая переписка вместо цепочки миграций, и почему инфраструктура и SVG-математика важнее списка логотипов в резюме.

Слогер 04.10.2026 ▲ 0
Карьера

Как выбрать тренажёр для mock-интервью: разбор AI-сервисов, живых интервьюеров и банков задач с ценами

Собеседование проверяет не только код, но и умение объяснять. Разбираем, какие сервисы для репетиции интервью стоят своих денег, а какие путают с тренажёрами.

Слогер 04.10.2026 ▲ 0
Разработка

Как отвечать на вопросы по Git на собеседовании: разбор механизмов вместо заученных команд

Git спрашивают почти на каждом техническом интервью, но проверяют не флаги, а модель репозитория в твоей голове. Разбираем частые вопросы и то, что за ними стоит.

Слогер 04.10.2026 ▲ 0
Карьера

Как составить резюме, которое пройдёт ATS: разбор для студентов-инженеров

Автоматические системы отсеивают резюме до того, как их увидит рекрутер. Разбираем, как описать дипломный проект, какие разделы поставить вперёд и какие ошибки в вёрстке убивают документ.

Слогер 04.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Карьера

Как подавать заявки на вакансии, не заполняя формы вручную: разбор в три шага

Расширение для браузера заполняет однотипные формы откликов за вас и через 15 минут присылает отчёт. Разбираем, как это устроено, где границы метода и какие настройки экономят нервы.

Слогер 03.10.2026 ▲ 0
Карьера

5 навыков разработчика, без которых технические знания простаивают

Карьеру в разработке двигает не количество выученных языков, а умение разбираться с задачей, объясняться с людьми и доводить проекты до конца. Разбираем пять навыков и то, как каждый из них проверить на текущей работе.

Слогер 03.10.2026 ▲ 0
Карьера

Как автоматизировать отклики на вакансии: разбор расширения, которое отправляет заявки за вас

Джуниор-разработчик написал бесплатное расширение для браузера, которое фильтрует вакансии и само заполняет формы — за неделю оно принесло ему пять собеседований. Разбираю логику работы, чек-лист безопасности и ошибки, из-за которых массовые отклики вредят.

Слогер 03.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Разработка

Чем опенсорс-команда отличается от работодателя: опыт участника проекта Pyxel из ESA

Инженер пришёл в открытый проект ESA с одним коммитом и получил там то, чего не дал ни один наниматель: подробную обратную связь, включённость и спасибо за каждый шаг. Разбираем, что именно сработало — и как повторить это у себя.

Слогер 02.10.2026 ▲ 0
Карьера

Почему процент откликов врёт: как считать воронку поиска работы и просроченные счета

Одна арифметическая идея работает и в таблице поиска работы, и в переписке с клиентом, который не платит: считайте только закрытые исходы и договоритесь о словах заранее.

Слогер 02.10.2026 ▲ 0
Карьера

Как получать пользу от IT-ассоциации: пять слоёв участия и план на первые 30 дней

Членство само по себе ничего не даёт. Разбираем, что реально можно делать внутри профессионального сообщества, что доступно всегда, а что зависит от людей, города и обстоятельств.

Слогер 02.10.2026 ▲ 0
Fluxs lenta
Реклама · fluxs.ru
Деньги

Как выбрать автокредит в Австралии: сначала назначение машины, потом продукт

Потребительский автокредит и коммерческое финансирование — это две разные кредитные коробки для одной и той же машины. Разбираем, как определить своё и что требовать у кредитора письменно.

Слогер 01.10.2026 ▲ 0