Программа курса:
Разбор задачи: Целевая Сумма
Предложенный нами код решения:
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]
DeaglenS
,Работает только для суммы двух чисел из списка, а не трех и более