Проходим массив и храним уже встреченные значения с индексами. Для каждого числа ищем target − число в словаре: так получаем разные индексы за ожидаемое O(n) времени и O(n) памяти.
Алгоритмы - LeetCode 1 - Two Sum
Проходим массив и храним уже встреченные значения с индексами. Для каждого числа ищем target − число в словаре: так получаем разные индексы за ожидаемое O(n) времени и O(n) памяти.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Алгоритмы - LeetCode 1 - Two Sum
Дано: задан массив целых чисел nums и целое число target. верните индексы двух чисел массива nums сумма которых равна target.
nums = [1,2,3,4,5], target = 3
Уточнения:
- задача имеет только одно верное сочетание индексов,
- нельзя использовать один и тот же индекс,
- расположение индексов в ответе не принципиально.
Ограничения:
- 2 <= nums.length <= 10^2,
- -10^9 <= nums[i] <= 10^9,
- -10^9 <= target <= 10^9
Пример:
Дано: nums = [1,16,34,65], target = 66 Ответ: [0,3]
Ответ
Проходим массив и храним уже встреченные значения с индексами. Для каждого числа ищем target − число в словаре: так получаем разные индексы за ожидаемое O(n) времени и O(n) памяти.
Сначала выполняется поиск, затем сохранение текущего элемента — один индекс не используется дважды.
def two_sum(nums, target):
seen = {}
for index, value in enumerate(nums):
complement = target - value
if complement in seen:
return [seen[complement], index]
seen[value] = index
raise ValueError('No solution')
Для [1, 16, 34, 65] и 66 ответ [0, 3]. Повторяющиеся значения тоже поддерживаются: для [3, 3] и 6 вернутся [0, 1]. По условию решение существует, исключение защищает от входа вне контракта.