Приведите пример решения задачи Two Sum с двумя указателями, отсортировав массив, двигая указатели с концов, сдвигая правый при слишком большой сумме и левый в противном случае. Какие у него ограничения и сложности?

Отсортируйте пары значение–исходный индекс, затем двигайте указатели навстречу: при большой сумме — правый, при маленькой — левый. Сортировка даёт O(n log n).

Короткий ответ

Что ответить на собеседовании

Отсортируйте пары значение–исходный индекс, затем двигайте указатели навстречу: при большой сумме — правый, при маленькой — левый. Сортировка даёт O(n log n).

Подробный разбор

Ответ с пояснениями

Отсортируйте пары значение–исходный индекс, затем двигайте указатели навстречу: при большой сумме — правый, при маленькой — левый. Сортировка даёт O(n log n).

def two_sum(values, target):
    pairs = sorted((value, index) for index, value in enumerate(values))
    left, right = 0, len(pairs) - 1
    while left < right:
        total = pairs[left][0] + pairs[right][0]
        if total == target:
            return pairs[left][1], pairs[right][1]
        if total > target:
            right -= 1
        else:
            left += 1
    return None

Память O(n) для сохранения исходных индексов; проход после сортировки O(n). Решение возвращает одну пару различных позиций. Если индексы потерять при сортировке, контракт Two Sum часто нарушается.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее