You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改说明

  1. 取消注释并修改子集收集方式:用arr.copy()创建当前列表的副本加入self.a,确保每个子集都是独立的对象,后续回溯操作不会影响已存入的结果。
  2. 提前排序nums:让重复元素相邻,这样跳过重复元素的逻辑才能正确过滤掉重复的子集。
  3. 用pop()替代remove(t):更高效且安全,因为我们明确知道最后一个元素就是刚添加的目标元素,remove()需要遍历列表查找,还可能在有重复元素时误删其他位置的元素。
  4. 移除类变量self.arr:改用递归参数传递临时列表,减少类状态带来的潜在干扰,逻辑更清晰。

内容的提问来源于stack exchange,提问作者Dipak Monty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:45:49