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); } }
【背!!!】

浙公网安备 33010602011771号