← Все вопросы

Что такое метод двух указателей (two pointers)?

Задан 18 месяцев назад490 просмотров2 ответа
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). Бывает два варианта: указатели с концов навстречу и быстрый/медленный (для поиска цикла в списке, например).

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект