题目
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
注意点
回溯排列参考:全排列(DFS回溯实现)
回溯组合参考:组合(回溯+剪枝实现)
1、一个数组的子集我们可以使用一颗树来表示,根节点为空集([]),第一层为个数为1的子集,第二层为个数为2的子集,以此类推;
2、将子集使用树表示后,我们发现:
- 第一层取所有节点;
- 第二层只取上一层之后的节点;(即第一层为2时,第二层只能取3,不能取1,取1就会跟左子树相同)
实现
class Solution {
//存放结果
List<List<Integer>> result = new LinkedList<>();
public List<List<Integer>> subsets(int[] nums) {
//回溯
dfs(nums, 0, new LinkedList<Integer>());
return result;
}
public void dfs(int[] nums, int start, LinkedList<Integer> list){
//将遍历到的每个节点都添加到结果中
result.add(new LinkedList<Integer>(list));
for (int i = start; i < nums.length; i ++){
//添加该层节点
list.add(nums[i]);
//追加获取下一层子集
dfs(nums, i + 1, list);
//回溯删除节点
list.removeLast();
}
}
}