Отсортируйте пары значение–исходный индекс, затем двигайте указатели навстречу: при большой сумме — правый, при маленькой — левый. Сортировка даёт O(n log n).
Приведите пример решения задачи Two Sum с двумя указателями, отсортировав массив, двигая указатели с концов, сдвигая правый при слишком большой сумме и левый в противном случае. Какие у него ограничения и сложности?
Отсортируйте пары значение–исходный индекс, затем двигайте указатели навстречу: при большой сумме — правый, при маленькой — левый. Сортировка даёт 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 часто нарушается.