题目描述
给定一个集合,包含互不相同的数,返回它的所有子集(幂集)。
注意;结果不能包含相同子集。
样例
输入:nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
算法
(DFS枚举) O(2^n)
Java 代码
class Solution {
// assume no concurrency
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
if (nums.length == 0) {
return res;
}
// 遍历每个位置放什么元素
dfs(nums, 0, new ArrayList<Integer>());
return res;
}
private void dfs(int[] nums, int start, ArrayList<Integer> path) {
res.add(new ArrayList<>(path));
// 尝试每个数字加入当前位子, 有点像combination,取数不能从i=0开始,应该从i=start(上个数字位置的下一个位置)开始选取,才不会重复,比如,选取了1,2,那么之后不能选取2,1
for (int i = start; i < nums.length; i++) {
path.add(nums[i]);
dfs(nums, i + 1, path);
path.remove(path.size() - 1);
}
}
}