Две суммы в коде python

#python-3.x #list

Вопрос:

Недавно я начал писать код на Python. Я буду признателен, если кто-нибудь сможет ответить на мой вопрос. Спасибо.

Учитывая массив целых чисел nums и целочисленную цель, возвращайте индексы двух чисел таким образом, чтобы они складывались в цель. Пример: Ввод: цифры = [2,7,11,15], цель = 9 Вывод: [0,1]

Это мой код:

 class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            j=i 1
            while j<len(nums):
                if nums[i]   nums[j] == target:
                    print(i,j)                    
                else:
                    i=i 1
 

Результат, который я получаю:
Превышен предел мощности
0 1
0 1
0 1……..

Кто-нибудь может сказать мне, что не так с кодом? Я знаю, что мы можем использовать перечисление и делать. Но я хочу знать причину превышения «Выходного предела».

Спасибо

Ответ №1:

Ваш код работает медленно, потому что у вас есть вложенные циклы ( for и while ). Таким образом, при больших вводах вы получаете ошибку тайм-аута.

Попробуйте преобразовать nums в словарь, где ключами будут числа и индексы значений. Таким образом, вы можете проверить, есть ли у вас второе число за O(1) раз:

 nums = [2, 7, 11, 15]
target = 9

nums = {v: i for i, v in enumerate(nums)}
for val, i in nums.items():
    if target - val in nums:
        print(i, nums[target - val])
        break
 

С принтами:

 0 1
 

Ответ №2:

В других ответах указываются другие проблемы с производительностью, которые могут привести к ошибке превышения лимита времени, и способы их устранения (и в процессе устраните свою реальную проблему с помощью побочного эффекта), но пропустите проблему, которая вызывает ошибку превышения наблюдаемого предела вывода. Решил, что я объясню реальную проблему, чтобы вы знали, что это значит, если увидите ее снова.

Ваша последняя реплика-это i=i 1 когда вы почти наверняка имели в виду j=j 1 . Поскольку вы никогда не меняетесь j , while цикл либо никогда не запускается (когда len(nums) == 1 ), либо выполняется вечно ( len(nums) > 1 ). Конечно, поскольку вы действительно меняетесь i , в конечном итоге i превышаете допустимые показатели nums , и ваш код умирает вместе с an IndexError . Обратная связь для этого IndexError почти наверняка длиннее, чем определенный предел вывода для такой простой проблемы, что вызывает проблему, которую вы видите.