Two Sum
Дан массив целых чисел nums и число target. Найдите индексы двух
элементов, сумма которых равна target. Каждый элемент можно использовать не более
одного раза, решение гарантированно единственное. Порядок индексов в ответе не важен.
nums.length ≤ 10⁴,
−10⁹ ≤ nums[i], target ≤ 10⁹.nums = [2, 7, 11, 15], target = 9 output = [0, 1] # nums[0] + nums[1] == 9
nums = [3, 2, 4], target = 6 output = [1, 2]
Подсказка
Перебор всех пар — это O(n²). Подумайте наоборот: проходя по массиву, для текущего числа
x вам нужен уже встреченный элемент target − x. Где быстрее всего
искать «встречалось ли значение и под каким индексом»?
Решение
Один проход с хэш-таблицей seen: значение → индекс. Проверяем, есть ли
«напарник» target − x, и только потом добавляем текущий элемент — так элемент
не «спарится» сам с собой.
def two_sum(nums, target):
seen = {}
for i, x in enumerate(nums):
need = target - x
if need in seen:
return [seen[need], i]
seen[x] = i
Сложность: время O(n), память O(n).