Python类变量列表无法添加子集:LeetCode子集II求解异常
解决LeetCode Subsets II问题中的子集收集为空问题
问题根源
你的代码出现返回空列表的原因及其他潜在问题:
- 核心原因:你把
self.a.append(arr)这行代码注释掉了,没有执行子集收集操作,自然返回空列表。 - 列表引用陷阱:就算取消注释,直接添加
arr也会出问题——因为你全程用的是同一个列表对象(self.arr),后续的remove操作会修改所有已经添加到self.a里的条目,最终所有子集都会变成空列表。 - 去重逻辑失效:原问题的输入nums可能包含不相邻的重复元素,你的去重逻辑依赖相邻元素相等,但没有提前排序,导致部分重复子集无法被过滤。
修正后的代码
from typing import List class Solution: def __init__(self): self.a = [] def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: nums.sort() # 先排序,确保重复元素相邻,保证去重逻辑生效 self.sq(0, [], nums) return self.a def sq(self, i, arr, nums): if i >= len(nums): self.a.append(arr.copy()) # 添加列表副本,避免后续回溯修改已存入的子集 return # 选择当前元素,进入递归 arr.append(nums[i]) self.sq(i + 1, arr, nums) # 回溯,移除当前元素 arr.pop() # 跳过所有重复的当前元素,避免生成重复子集 while i < len(nums) - 1 and nums[i + 1] == nums[i]: i += 1 # 不选择当前元素,进入递归 self.sq(i + 1, arr, nums)
关键修改说明
- 取消注释并修改子集收集方式:用
arr.copy()创建当前列表的副本加入self.a,确保每个子集都是独立的对象,后续回溯操作不会影响已存入的结果。 - 提前排序nums:让重复元素相邻,这样跳过重复元素的逻辑才能正确过滤掉重复的子集。
- 用
pop()替代remove(t):更高效且安全,因为我们明确知道最后一个元素就是刚添加的目标元素,remove()需要遍历列表查找,还可能在有重复元素时误删其他位置的元素。 - 移除类变量
self.arr:改用递归参数传递临时列表,减少类状态带来的潜在干扰,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Dipak Monty
相关产品推荐
相关产品推荐

