.子集
- 题目描述
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
- 题目分析
本题是一个子集问题,对于子集问题,我们可以通过一棵树来描绘,发现每次我们要收获的子集分布于每个节点之上,因此我们在每次递归之前将节点记录,当遍历完整棵树时,也就是所有的子集(这里给的nums中没有重复的数,因此不必担心有重复的结果)
完整思路:
1 初始化变量
path 是一个 LinkedList,用于存储当前正在构建的子集。
result 是一个 ArrayList 的 ArrayList,用于存储所有可能的子集。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();}}