0
点赞
收藏
分享

微信扫一扫

【回溯】78.子集

kiliwalk 2022-04-02 阅读 56

题目:

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

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

题解:

如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

78.子集

步骤:

1.递归函数参数

全局变量path为子集收集元素,res存放子集组合。(也可以放到递归函数参数里)

递归函数参数需要startIndex。

2.递归终止条件

剩余集合为空的时候,就是叶子节点。就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了。

其实可以不需要加终止条件,因为startIndex >= nums.size(),本层for循环本来也结束了

3.单层搜索逻辑

求取子集问题,不需要任何剪枝!因为子集就是要遍历整棵树

class Solution {
    LinkedList<Integer> path = new LinkedList<>();
    List<List<Integer>> res = new LinkedList<>();

    public List<List<Integer>> subsets(int[] nums) {
        backtracking(nums, 0);
        return res;
    }

    public void backtracking(int[] nums, int startIndex) {
        // 收集子集,要放在终止添加的上面,否则会漏掉自己,也把空集添加进去
        res.add(new LinkedList<>(path));
        if (startIndex >= nums.length) {
            return;
        }
        for (int i = startIndex; i < nums.length; i++) {
            path.add(nums[i]);
            backtracking(nums, i + 1);
            path.remove(path.size() - 1);
        }
    }
}

参考:代码随想录 

举报

相关推荐

0 条评论