Программа курса:
Разбор задачи: Целевая Сумма
Предложенный нами код решения:
def target_sum(nums, target):
num_to_index = {}
# Проходим по каждому числу в списке
for i, num in enumerate(nums):
# Вычисляем число, которое необходимо найти
complement = target - num
# Если дополнение уже в словаре, возвращаем индексы
if complement in num_to_index:
return [num_to_index[complement], i]
# Если дополнения нет, добавляем число в словарь
num_to_index[num] = i
Что делает алгоритм:
- Создаёт пустой словарь
num_to_index
, который будет хранить числа из спискаnums
и их индексы. - Последовательно проходит по каждому числу в списке
nums
с помощью циклаfor
. - Для каждого числа
num
вычисляет разницуtarget - num
, называемую дополнением (complement
). - Проверяет, содержится ли это дополнение в словаре:
- Если дополнение уже есть, значит, найдено два числа, которые дают сумму
target
. Функция возвращает индексы этих чисел. - Если дополнение отсутствует, текущее число и его индекс добавляются в словарь для дальнейшей проверки.
- Если дополнение уже есть, значит, найдено два числа, которые дают сумму
Пример работы алгоритма:
Входные данные:
nums = [1, 5, 3, 8], target = 11
- Итерация 1:
- Текущее число:
1
, индекс:0
- Вычисляем дополнение:
11 - 1 = 10
- Проверяем:
10
отсутствует в словаре. - Добавляем число в словарь:
{1: 0}
.
- Текущее число:
- Итерация 2:
- Текущее число:
5
, индекс:1
- Вычисляем дополнение:
11 - 5 = 6
- Проверяем:
6
отсутствует в словаре. - Добавляем число в словарь:
{1: 0, 5: 1}
.
- Текущее число:
- Итерация 3:
- Текущее число:
3
, индекс:2
- Вычисляем дополнение:
11 - 3 = 8
- Проверяем:
8
отсутствует в словаре. - Добавляем число в словарь:
{1: 0, 5: 1, 3: 2}
.
- Текущее число:
- Итерация 4:
- Текущее число:
8
, индекс:3
- Вычисляем дополнение:
11 - 8 = 3
- Проверяем:
3
уже есть в словаре с индексом2
. - Возвращаем
[2, 3]
.
- Текущее число:
Итог:
Функция возвращает [2, 3]
, так как nums[2] + nums[3] == 11
.
Другие примеры:
Входные данные:
nums = [2, 7, 11, 15], target = 9
- Число
2
, индекс0
: Дополнение7
отсутствует. - Число
7
, индекс1
: Дополнение2
найдено в словаре. - Возвращается
[0, 1]
.
Результат:
[0, 1]