LeetCode 78. 子集(回溯)

本文详细介绍了如何使用Java实现数组的所有子集(幂集)生成,通过深度优先搜索(DFS)算法,展示了如何避免在回溯过程中导致结果集为空的问题。示例代码解释了为何直接添加引用会导致输出错误,并提供了正确处理方式的说明。
摘要由CSDN通过智能技术生成
  1. 子集
    给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:

输入:nums = [0]
输出:[[],[0]]

class Solution {
  public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        dfs(nums,0,ans,new ArrayList<Integer>() );
        return ans;
    }
    public static  void dfs(int[] num,int index,List<List<Integer>> ans,List<Integer> tem ){
        if(index == num.length){
            ans.add(new ArrayList<Integer>(tem));
            //ans.add(tem);
            return;
        }
        //不选
        dfs(num,index+1,ans,tem);

        //选

        tem.add(num[index]);
        dfs(num,index+1,ans,tem);
        tem.remove(tem.size() - 1);
    }
}

注意: 用 ans.add(new ArrayList<Integer>(tem));是正确的输出,但是如果使用ans.add(tem);的话,就会输出空的。在这里插入图片描述
这是因为如果是直接ans.add(tem);,ans中指向的是tem的值,由于会进行tem.remove(tem.size() - 1);,所以在dfs结束之后tem的值为空。所以ans就为空。在示例中,一共会执行ans.add(tem);八次,所以在ans中又八个tem,由于最终tem的值为空,所以就会输出八个空的。用 ans.add(new ArrayList<Integer>(tem));的话,就相当于是新建了一个列表的值和当前的tem相等,然后将其添加进入add,此时add中的值便不会受到tem的影响,就有正确的输出。
有个例子:
在这里插入图片描述
每次进行一次ans.add(tem),就相当于是把一个tem加入到了ans中,最终的值由最终的tem来决定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超好的小白

没体验过打赏,能让我体验一次吗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值