Не могу понять логики

Есть класс, в котором необходимо вернуть числа, в сумме дающие target. Не могу понять в чем проблема, потому что при работе выдает ошибку list index out of range. Сами данные: nums = [2,7,11,15], target = 9

class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:
        nums_copy = nums
        new_nums = []
        for i in nums:
            for j in nums_copy:
                if (nums[i] + nums_copy[j]) == target:
                    new_nums.append(i)
        return(new_nums)

Ответы (2 шт):

Автор решения: vvvvvvvvvvv

Как бы сказать, вы проходитесь напрямую по числам:

for i in nums:
    ...

Т.е. ваш цикл будет выглядеть так:

На первой итерации i=2, на второй i=7, на третьей i=11, на четвертой i=15. Уже на второй итерации i превысит длину списка и вызовет IndexError.

Понятное дело, что вам нужно проходиться по длине списка. Для этого нужно создать последовательность от нуля до длины списка:

for i in range(len(nums)):
   ...

Таким образом, ваш цикл будет проходиться по индексам от нулевого до последнего.

То есть ваш код должен выглядеть так:

class Solution:
    def twoSum(self, nums: list[int], target: int) -> list[int]:
        nums_copy = nums
        new_nums = []
        for i in range(len(nums)):
            for j in range(len(nums_copy)):
                if (nums[i] + nums_copy[j]) == target:
                    new_nums.append(i)
        return(new_nums)
→ Ссылка
Автор решения: MBo
  1. Вам не нужны никакие копии списков

  2. Требуется вернуть список с парой индексов, а не что попало

  3. Индексы должны быть различными, т.е. для [2,1,3],4 нужно вернуть [1,2],а не 0 два раза


for i in range(len(nums)-1):
    for j in range(i+1, len(nums)):
        if (nums[i] + nums[j]) == target:
            return [i, j]

Такое решение даст верный ответ, но оно довольно медленное (квадратичное). Возможно, оно сойдёт для ограничений этой вводной задачи на литкоде. А для более быстрого решения (с линейной сложностью, но дополнительной памятью) можно использовать словарь, содержащий значения элементов как ключ, и индекс как значение

→ Ссылка