LeetCode Subsets II问题调试:DFS代码输出缺失子集
问题分析与修复
你的DFS代码缺失子集的原因是去重条件错误。当前的判断if i > 0 and nums[i] == nums[i-1]: continue会跳过所有与前一个元素相同的项,但实际上我们只需要跳过同一层递归中重复的元素——也就是当i > pos(而非i > 0)且当前元素与前一个元素相同时才跳过。
举个例子:当处理到pos=1的层级(此时当前子集是[],要选第二个位置的元素),i=1对应的是第一个2,这时候i等于pos,即使nums[i]和nums[i-1]相同,也应该保留这个选择,这样才能生成[2]之后的[2,2];而如果i>pos(比如i=2,此时pos=1),nums[i]和nums[i-1]相同,这时候才需要跳过,避免生成重复的子集。
修正后的代码
def subsets_dfs(nums): nums.sort() res = [] def dfs(nums, res, cur, pos): res.append(cur) for i in range(pos, len(nums)): # 修正去重条件:仅当i大于当前起始位置pos时,才跳过重复元素 if i > pos and nums[i] == nums[i-1]: continue dfs(nums, res, cur + [nums[i]], i + 1) dfs(nums, res, [], 0) return res
测试输入nums = [1,2,2],输出结果为:[[], [1], [1, 2], [1, 2, 2], [2], [2, 2]],与题目要求的正确结果一致(顺序略有不同,但子集内容完全符合要求)。
内容的提问来源于stack exchange,提问作者VRM
相关产品推荐
相关产品推荐

