蟒蛇幂集,搞不清我的错误



我的代码将崩溃并永远运行:

def subsets(nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    results = [[]]
    for num in nums:
        for result in results:
            results.extend([result + [num]])
    return results 

当我在谷歌上搜索时,发现了类似的解决方案:

def subsets(nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    results = [[]]
    for num in nums:
        results.extend([result + [num] for result in results])
    return results

这里有什么不同?

关键部分是:

for result in results:
    results.extend([result + [num]])

在这里,您正在对results列表进行迭代。迭代器总是有生命的东西,直到你真正到达终点才结束。对于列表,您可以简单地将其想象为一个指针,从第一个元素开始,然后一直转到下一个元素,直到它到达末尾。

除了在您的情况下,您在每次迭代中将一个元素(因为[result + [num]]是一个单元素列表)添加到results列表中。因此,当迭代器继续前进时,您不断在末尾添加一个元素,以确保迭代器永远不会到达末尾。

一般来说,您永远不应该修改当前正在迭代的集合。因此,在这种情况下,在迭代相同的东西时,不应该修改results

这正是另一个解决方案中的以下行所避免的:

results.extend([result + [num] for result in results])

这使用了列表理解,本质上等同于:

tmp = []
for result in results:
    tmp.append(result + [num])
results.extend(tmp)

正如您所看到的,当对results进行迭代时,它并没有被修改。首先创建tmp列表,然后完成后,通过将其扩展到整个tmp列表来修改results列表。

最新更新