【发布时间】:2019-01-13 22:43:06
【问题描述】:
我目前正在练习一个面试问题,并且我必须在给定列表的情况下返回所有可能的子集。
例如,
Input: [1,2,2]
Output:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
就是答案。
class Solution(object):
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
subset = []
self.backtrack(sorted(nums), res, subset, 0)
return res
def backtrack(self, nums, res, subset, start):
res.append(list(subset))
for i in range(start, len(nums)):
if i > start and nums[i] == nums[i - 1]:
continue
subset.append(nums[i])
self.backtrack(nums, res, subset, start + 1)
subset.pop()
我的解决方案如上,使用回溯。我检查了条件if i > start and nums[i] == nums[i - 1] 来处理重复项。但是,我的输出是[[],[1],[1,2],[1,2,2],[2],[2,2],[2,2,2]],给出了一个额外的[2, 2, 2],这是不应该生成的。
我按照我的代码绘制了一个图表,但仍然不明白为什么会生成它。不是应该在那之前终止吗?
谢谢
【问题讨论】:
-
1) 您不需要为此开设课程。它什么也不做。 2)我猜你是这样使用代码的:
print(Solution().subsetsWithDup([1,2,2])),对吧?将其添加到问题中,使其成为complete and verifiable。 3) 你对nums做的第一件事是sorted(nums)- 这已经错了,你为什么要排序? 4) 你必须使用复杂的递归方法和backtrack来完成你的任务吗?如果没有,为什么不直接遍历所有start和end索引以获取所有子列表,然后最后删除重复项?
标签: python recursion backtracking