LeetCode 78.子集

本文解析了如何使用回溯算法解决整数数组幂集问题,通过递归实现子集生成,避免重复,并提供了详细的代码示例和思路分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给你一个整数数组 nums ,数组中的元素互不相同 。返回该数组所有可能的子集(幂集)。

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

思路:

  • 该题目是回溯类型的一种,相同类型的题目还有全排列等等。但是这道题还是和全排列有些不同的
  • 因为求子集,我们从第一个元素出发,所有情况都要加入到res集合中,没有临界条件,等curindex超过数组长度nums.length时,就自动退出方法
  • 因为每种情况都是在上一个元素选择或不选择的基础上来的,所以dfs方法中的循环每次都需要从curindex开始,一直到数组末尾结束。遍历过程中遇到的每个元素都有选择或不选择两种情况。
  • 本题可以和全排列问题结合着做,印象会更深刻一点。

以下为代码+注释:

 	private List<Integer> cur = new ArrayList<>();
    private List<List<Integer>> res = new ArrayList<List<Integer>>();

    public List<List<Integer>> subsets(int[] nums) {
        // 回溯
        dfs(nums, 0);
        return res;
    }

    public void dfs(int[] arr, int curindex){
        // 先将该元素加入集合中
        res.add(new ArrayList<>(cur));
        // 该题目不需要临界条件,因为所有遍历到的情况都需要加入到结果集中
        // 等到索引超过数组长度就自动退出

        // 从当前curindex位置一直遍历到最后一个
        // 每遍历一个数字,都有两个情况,要么选,要么不选
        // 之后,再在这一层的基础上对后续的数组值进行选择是否加入
        for(int i = curindex; i < arr.length; i++){
            cur.add(arr[i]);
            dfs(arr, i + 1);
            // 回溯,删除最后一个元素
            cur.remove(cur.size() - 1);
        }
    }

笔者也在不断学习中,如有错误,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值