← Все вопросы
Что такое метод двух указателей (two pointers)?
13
В разборах задач часто пишут «решается двумя указателями». Что это за приём и в каких задачах он помогает? Можно простой пример?
2 ответа
20
✓ Принятый ответ — помог автору
Два указателя — это когда вместо вложенных циклов (O(n²)) ты ведёшь по массиву два индекса и двигаешь их навстречу или в одну сторону, решая задачу за один проход O(n).
Классика — найти в ОТСОРТИРОВАННОМ массиве пару с заданной суммой:
def two_sum_sorted(a, target):
left, right = 0, len(a) - 1
while left < right:
s = a[left] + a[right]
if s == target:
return (left, right)
if s < target:
left += 1 # сумма мала — двигаем левый вправо
else:
right -= 1 # сумма велика — двигаем правый влево
return None
print(two_sum_sorted([1, 3, 4, 5, 7, 11], 9)) # (1, 3) -> 3+... ну вы поняли идею
Работает в палиндромах, слиянии массивов, удалении дубликатов на месте — везде, где можно идти с двух концов или «медленный/быстрый» указатель.
Оксана Баранова главное что массив должен быть отсортирован для этого трюка с суммой · 18 месяцев назад
8
Приём «два индекса вместо двух циклов». Часто превращает O(n²) в O(n). Бывает два варианта: указатели с концов навстречу и быстрый/медленный (для поиска цикла в списке, например).
Ваш ответ
Войдите, чтобы ответить на вопрос.