WELCOME TO Pluto134340小行星

清风湿润,茶烟轻扬。

56.子集

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

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

 示例 1:灵茶山艾府

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

方法来源:

非边界条件:不选 dfs(i+1);  选先加路径再递归

递归终止条件:已经处理完数组所有元素(i等于数组长度)

核心逻辑是:对每个元素,都做 “选” 或 “不选” 两种决策,递归处理后续元素,直到所有元素处理完毕,就得到一个完整子集。

class Solution {
    // 最终存储所有子集的结果集(全局变量,避免递归中反复传参)
    private final List<List<Integer>> ans = new ArrayList<>();
    // 存储当前正在构建的子集(路径),递归中动态修改
    private final List<Integer> path = new ArrayList<>();
    // 保存输入的数组,方便递归方法访问
    private int[] nums;

    public List<List<Integer>> subsets(int[] nums) {
        this.nums = nums; // 给全局变量赋值
        dfs(0); // 从数组第0个元素开始深度优先搜索
        return ans; // 返回所有子集
    }

    public void dfs(int i){
        // 递归终止条件:已经处理完数组所有元素(i等于数组长度)
        if(i==nums.length) {
            // 把当前构建好的path(一个完整子集)加入结果集
            // 注意:必须new ArrayList(path),否则后续修改path会影响ans里的内容
            ans.add(new ArrayList(path));
            return ;
        }

        // 第一种选择:不选第i个元素,直接处理下一个元素(i+1)
        dfs(i+1);

        // 第二种选择:选第i个元素
        path.add(nums[i]); // 把nums[i]加入当前子集
        dfs(i+1); // 处理下一个元素

        // 回溯:撤销“选第i个元素”的操作,恢复path原样
        path.remove(path.size()-1);
    }

}

【背!!!】

posted @ 2026-02-03 11:57  Pluto134340  阅读(0)  评论(0)    收藏  举报