回溯算法07-子集(Java/子集问题)

.子集

  • 题目描述

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

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

示例 2:

输入:nums = [0]
输出:[[],[0]]
  • 题目分析

image-20240307163848512

本题是一个子集问题,对于子集问题,我们可以通过一棵树来描绘,发现每次我们要收获的子集分布于每个节点之上,因此我们在每次递归之前将节点记录,当遍历完整棵树时,也就是所有的子集(这里给的nums中没有重复的数,因此不必担心有重复的结果)
完整思路:   
1 初始化变量
path 是一个 LinkedList,用于存储当前正在构建的子集。
result 是一个 ArrayListArrayList,用于存储所有可能的子集。
    
2 backtrack 函数
递归基础情况:如果 startIndex 大于数组长度,说明没有更多的元素可以添加到当前子集中,因此将 path 添加到 result 中,并返回。
递归调用:遍历从 startIndex 到数组末尾的每个元素。
对于每个元素,首先将其添加到 path 中。
递归调用 backtrack 函数,startIndex 增加 1,以处理下一个元素。
回溯:在递归调用返回后,从 path 中移除最后一个添加的元素,以便尝试其他可能性。    
  • Java代码实现
LinkedList<Integer> path = new LinkedList<>();
    List<List<Integer>> result = new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
        backtrack(nums, 0);
        return result;
    }

    private void backtrack(int[] nums, int startIndex) {
        result.add(new ArrayList<>(path));
        //终止条件
        if (nums.length < startIndex) return;

        for (int i = startIndex; i < nums.length; i++) {
            path.add(nums[i]);
            backtrack(nums, i + 1);
            path.removeLast();
        }
        
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值