【问题标题】:Returning all possible subsets given a list returns wrong answer返回给定列表的所有可能子集返回错误答案
【发布时间】: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 来完成你的任务吗?如果没有,为什么不直接遍历所有 startend 索引以获取所有子列表,然后最后删除重复项?

标签: python recursion backtracking


【解决方案1】:

isValidSubset 函数在 nums 到子集之间做子结构,所以对于 [1,2,2] - [2,2,2] 保持 2 并希望成为有效的子集

def subsetsWithDup(nums):
    res = []
    subset = []
    backtrack(sorted(nums), res, subset, 0)
    return res


def isValidSubset(s, n):
    nums = s.copy()
    subset = n.copy()
    return len([i for i in nums if not i in subset or subset.remove(i)]) == 0


def backtrack(nums, res, subset, start):
    if (isValidSubset(subset, nums)):
        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])
        backtrack(nums, res, subset, start + 1)
        subset.pop()


a = [1, 2, 2]
b = [2, 2, 2]

print(subsetsWithDup(a))

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2018-10-03
    相关资源
    最近更新 更多