Не могу понять логики
Есть класс, в котором необходимо вернуть числа, в сумме дающие 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 шт):
Как бы сказать, вы проходитесь напрямую по числам:
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)
Вам не нужны никакие копии списков
Требуется вернуть список с парой индексов, а не что попало
Индексы должны быть различными, т.е. для
[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]
Такое решение даст верный ответ, но оно довольно медленное (квадратичное). Возможно, оно сойдёт для ограничений этой вводной задачи на литкоде. А для более быстрого решения (с линейной сложностью, но дополнительной памятью) можно использовать словарь, содержащий значения элементов как ключ, и индекс как значение