Получите 2 очка

Паттерн/техника двух указателей

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

В чем смысл?

Этот шаблон полезен, когда нам нужно проанализировать каждый элемент коллекции по сравнению с другими ее элементами.

Чтобы решить подобные проблемы, мы могли бы начать с первого индекса и выполнить цикл один или несколько раз. Хотя грубая сила или наивное решение с одним указателем будут работать, они будут производить что-то вроде временной сложности O (n²). Во многих случаях два указателя могут помочь вам найти решение с лучшим временем выполнения или сложностью пространства за счет обработки двух элементов в цикле вместо одного.

Направьте меня в правильном направлении

Многие варианты шаблона двух указателей можно классифицировать как противоположно направленные или равнонаправленные.

  • В противоположном направлении — два указателя движутся в противоположном направлении.
  • Равнонаправленный — два указателя движутся в одном направлении.

Противоположное направление

Один указатель начинается с начала, а другой указатель начинается с конца, двигаясь навстречу друг другу, пока они оба не удовлетворят условию.

Этот шаблон актуален, когда:

  • есть целевое значение для сопоставления или дубликаты, которые необходимо удалить
  • проблема связана с отсортированными массивами (или связанными списками), набором парных элементов, триплетом или даже подмассивом
  • вам нужно найти набор элементов, которые удовлетворяют определенным ограничениям

Примеры проблем

Пример

Равнонаправленные (быстрые и медленные указатели)

Существует множество вариантов, в которых используются быстрые и медленные указатели, в том числе: Черепаха и заяц Флойда. Как правило, один указатель (быстрый указатель) перемещается на каждой итерации, а другой указатель (медленный указатель) перемещается с некоторыми ограничениями. Для более сложных сценариев быстрый бегун также перемещается с некоторыми ограничениями.

Этот шаблон актуален, когда:

  • проблема связана с чем-то, связанным с циклическими структурами данных
  • вам нужно знать положение определенного элемента или общую длину связанного списка
  • проблема связана с циклом в связанном списке или отсортированном массиве

Примеры проблем

Пример

📚 Ресурсы 👀

AfterAcademy — Что такое метод двух указателей?

Шаблоны алгоритмов: два указателя — часть 1

14 шаблонов для ответа на любой вопрос на собеседовании по программированию

Шаблоны кодирования: два указателя

Шаблоны кодирования: быстрые и медленные указатели