Это техника решения задач, где по структуре данных (обычно массиву или строке) одновременно двигаются два индекса.
Это про наличие двух подвижных границ внутри линейного пространства.
Самый простой пример:
[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²)
И решение оказывается через два индекса вместо вложенных циклов.
Если ты начинаешь системно изучать алгоритмы, то обычно после массивов и хеш-таблиц идут:
- Arrays
- Hash Maps
- Two Pointers
- Sliding Window
- Stack
- Binary Search
- Linked List
- Trees
- Graphs
- Dynamic Programming
То есть Two Pointers — одна из базовых техник, которую реально стоит освоить очень рано. Она встречается постоянно.