[本文给出了] 448。查找数组中消失的所有数字

时间:2016-12-26 04:59:49

标签: python-2.7

problem link from leetcode

我想出了两个用Python写的解决方案,但没有通过,也不知道为什么。

  

给定一个整数数组,其中1≤a[i]≤n(n =数组的大小),   一些元素出现两次,其他元素出现一次。

     

查找[1,n]中包含的所有元素,但不包括在内   阵列。

这是我的第一个解决方案:

class Solution(object):
  def findDisappearedNumbers(self, nums):
     nums=sorted(list(set(nums)))
     for x in range(1, nums[-1] + 1):
       if x in nums:
         nums.remove(x)
       else:
         nums.append(x)
     return nums

结果是“运行时错误消息:第4行:IndexError:列表索引超出范围”。但我没有得到它。

第二种解决方案:

return [x for x in range(1, len(nums) + 1) if x not in nums]

结果是“时间限制超出”,仍然困惑。

这两个解决方案在我的pycharm中使用python 2.7.11都可以正常工作。也许有一些测试用例我的解决方案没有通过,但我找不到它。

4 个答案:

答案 0 :(得分:0)

首先,尝试使用xrange而不是range,因为当nums的值非常大时,这会占用更少的空间。此外,您尝试迭代以及在同一个数组中同时删除/追加值。这很可能是您收到错误的原因。

此外,删除列表中的值(如果它不在最后)需要花费很多时间,因为在它需要移动之前所有其他元素。

答案 1 :(得分:0)

从第一个解决方案:不要修改您正在迭代的列表。总是带来问题。更好地复制列表并修改列表!

class Solution(object):
    def findDisappearedNumbers(self, nums):
        nums=sorted(list(set(nums)))
        nums_copy = nums.copy(nums)
        for x in range(1, nums[-1] + 1):
            if x in nums:
                nums_copy.remove(x)
            else:
                 nums_copy.append(x)
        return nums_copy

另一方面,如果num非常大(有很多元素)range会带来问题,因为它会先创建列表(并且非常大的列表会占用大量内存)。对我来说,xrange比返回发电机更好。 这在python3中不会发生,其中默认range返回生成器。

答案 2 :(得分:0)

您可以使用 nums = set(nums) 排序并删除所有重复项。然后,您可以运行一个循环,将 nums 中不存在的所有数字附加到输出数组中。

答案 3 :(得分:-1)

如果测试输入为空列表,则第一个解决方案将失败,因为num [-1]会使索引超出范围。 你的第二个解决方案将很慢,因为它必须遍历列表。以下解决方案是否有效?设置操作已经过优化。但空间复杂性对你来说是否合适?

    ret = set(range(1, len(nums)+1))
    ret = ret - set(nums)
    return list(ret)