Учитывая массив целых чисел, каждый элемент появляется дважды, за исключением . Найдите этот единственный.Почему мой код python настолько медленный (leetcode)?
Примечание: Ваш алгоритм должен иметь сложность линейного выполнения. Не могли бы вы реализовать его без использования дополнительной памяти?
class Solution:
# @param {integer[]} nums
# @return {integer}
def singleNumber(self, nums):
prev = []
for i,j in enumerate(nums):
if j in prev:
nums[i] = -j
else:
prev.append(j)
return sum(nums)
Это вопрос от leetcode и на самом деле один с самой высокой скоростью переменного тока. Однако, как мой код идет, он говорит мне, что Time Limit Exceeded и не может быть принят. Может ли кто-нибудь проанализировать мой код, включая сложность? Огромное спасибо.
Upadate: Спасибо всем, и я изменил «prev» из списка на набор, который работает красиво!
class Solution:
# @param {integer[]} nums
# @return {integer}
def singleNumber(self, nums):
prev = set([])
for i,j in enumerate(nums):
if j in prev:
nums[i] = -j
else:
prev.add(j)
return sum(nums)
Однако я все еще ищу решения, которые не требуют лишних воспоминаний, как описывает этот вопрос.
Обновление: Я использовал другой способ, пытаясь решить проблему, но снова получил время превышенное.
class Solution:
# @param {integer[]} nums
# @return {integer}
def singleNumber(self, nums):
for i,j in enumerate(nums):
if j in set(nums[:i+1]):
nums[i] = -j
return sum(nums)
На самом деле я своего рода замешательстве, что делает срез как Nums [: я + 1] создать отдельный список каждый цикл? Итак, создание списка является самым трудоемким здесь? Я использовал набор вместо списка, поэтому это может снизить стоимость поиска.
Попробуйте использовать набор вместо массива (или просто XOR всех значений вместе) –
благодарственных вы и это идея. – tonyabracadabra
Попробуйте заменить список 'prev' на набор. Это должно уменьшить сложность поиска из O (n), что делает всю проблему O (n ** 2) равной O (1). – deets