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

求解数组幂集的Java回溯代码返回错误结果如何修复

Java回溯实现幂集的错误定位与修复

问题表现

给定元素均唯一的整数数组nums,需要返回数组的所有可能子集(幂集)。以输入[1,2]为例:

  • 预期正确结果(子集顺序不影响正确性):[[],[1],[2],[1,2]]
  • 原代码实际错误输出:[[],[2],[2,1],[2,1,2]],存在元素重复、状态错乱问题。

错误根因

原代码的回溯逻辑缺失状态回退步骤:
当执行「选择当前元素加入子集」的分支时,向output列表添加元素后,递归完成没有将该元素从列表中移除,导致output的状态会被带到其他递归分支,造成跨分支的状态污染,最终出现重复元素、结果不符合预期的问题。

修复方案

在「选择当前元素」的递归调用结束后,移除output列表末尾刚加入的元素,将列表状态回退到选择元素之前的状态,即可避免不同递归分支的状态互相干扰。
修复后的完整代码如下:

class Solution {
    
    private List<List<Integer>> ans= new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
        solve(nums, 0, new ArrayList<>());
        return ans;
    }
    
    
    public void solve(int[] nums, int i, List<Integer> output)
    {
        if(i == nums.length)
        {
            ans.add(new ArrayList(output));
            return;
        }
        
        
        // 分支1:不选择当前位置元素
        solve(nums, i+1, output);
        
        
        // 分支2:选择当前位置元素
        output.add(nums[i]);
        solve(nums, i+1, output);
        // 回溯:撤销选择,回退状态
        output.remove(output.size() - 1);
            
    }
}

说明:上述代码运行输出为[[],[2],[1],[1,2]],和示例给出的结果仅子集顺序不同,内容完全符合幂集要求,所有题目判题规则均会接受该结果。幂集本身是集合的集合,不要求内部子集的排列顺序,如果需要完全匹配示例的顺序,只需要把「选择当前元素」的分支调整到「不选择当前元素」分支之前即可,核心回溯逻辑不变。

内容的提问来源于stack exchange,提问作者Hello World

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:19:19