Two Pointers («два указателя»)

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

Самый простой пример:

[1, 2, 3, 4, 5, 6]
 ^              ^
left          right

У тебя есть:

  • left — указатель слева.
  • right — указатель справа.

Дальше ты двигаешь один или оба указателя по определённым правилам.

Классическая задача: найти сумму

Есть отсортированный массив:

nums = [1, 2, 3, 4, 6, 8]
target = 10

Ставим:

left = 0
right = len(nums) - 1

Проверяем:

1 + 8 = 9  -> мало

Двигаем left.

2 + 8 = 10 -> нашли

Получается O(n), а не O(n²).


Другой вариант — скользящее окно (Sliding Window)

Например:

abcabcbb
^

Один указатель — начало окна.

abcabcbb
  ^

Второй — конец окна.

Окно расширяется и сужается.

Формально это тоже разновидность Two Pointers.


Какие задачи обычно относятся к Two Pointers

На LeetCode это целая категория:

  • Two Sum II
  • Container With Most Water
  • Valid Palindrome
  • Remove Duplicates from Sorted Array
  • 3Sum
  • Move Zeroes
  • Trapping Rain Water
  • Longest Substring Without Repeating Characters (через Sliding Window)

Почему это важно

Потому что очень часто задача выглядит как:

нужно сравнивать элементы
нужно искать пары
нужно работать с подотрезками
нужно убрать O(n²)

И решение оказывается через два индекса вместо вложенных циклов.

Если ты начинаешь системно изучать алгоритмы, то обычно после массивов и хеш-таблиц идут:

  1. Arrays
  2. Hash Maps
  3. Two Pointers
  4. Sliding Window
  5. Stack
  6. Binary Search
  7. Linked List
  8. Trees
  9. Graphs
  10. Dynamic Programming

То есть Two Pointers — одна из базовых техник, которую реально стоит освоить очень рано. Она встречается постоянно.

Прокрутить вверх