生成数组的所有可能子集都会返回一个空列表

时间:2019-01-12 03:52:58

标签: python recursion

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """

        res = []
        self.backtrack(sorted(nums), 0, [], res)
        return res

    def backtrack(self, nums, idx, subset, res):
        res.append(subset)
        for i in range(idx, len(nums)):
            subset.append(nums[i])
            self.backtrack(nums, i + 1, subset, res)
            subset.pop()

立即进行面试。我应该生成给定列表的所有子集。 例如,

Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

但是,我的解决方案返回[[],[],[],[],[],[],[],[]],但我不确定为什么。我试图提出解决方案,但我不知道为什么子集变成空列表。

可能是什么问题?

2 个答案:

答案 0 :(得分:1)

常见错误,您将实际指针保存为subset而不是副本:

res.append(subset)

最后,您将获得subset最终状态的重复列表。而是:

res.append(list(subset))

强制执行一份不会更改的副本。

仅供参考,我们可以编写此解决方案的另一种方法:

def subsets(self, numbers):

    def subsets_recursive(numbers, index, subset):
        result = [list(subset)]

        for i in range(index, len(numbers)):
            subset.append(numbers[i])
            result += subsets_recursive(numbers, i + 1, subset)
            subset.pop()

        return result

    return subsets_recursive(sorted(numbers), 0, [])

答案 1 :(得分:1)

您可以使用itertools组合获得相同的结果:

from itertools import combinations
t = [list(combinations(nums, i)) for i in range(4)]
output = [list(j) for k in t for j in k]
#output: [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]