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],
[]
]
但是,我的解决方案返回[[],[],[],[],[],[],[],[]]
,但我不确定为什么。我试图提出解决方案,但我不知道为什么子集变成空列表。
可能是什么问题?
答案 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]]