文章目录
解题思路:时间复杂度O(
n
∗
2
n
n*2^n
n∗2n),2的n次方是因为每个数都有2种状态。空间复杂度O(n) |
---|
- 对于每一个数字,都有两种选择,入集合,和不入集合
- 用[1,2,3]举例,每个数字都不入,就是空集,都入,就是满集[1,2,3]
- 依次判断每个数字
- 先取1,我们先入集合, 然后2,入集合,3入集合,此时产生满集[1,2,3]
- 回到3,选择不入集合,此时产生[1,2]
- 回到2,选择不入集合,3入集合,产生[1,3]
- 再次回到3,选择不入集合,产生[1]
- 回到1,选择不入集合,2选择入,3选择入,产生[2,3]
- 回到3,选择不入集合,产生[2]
- 回到2,选择不入集合,3选择入,产生[3]
- 回到3,选择不入集合,产生空集[]
- 最终这个例子的结果为
class Solution {
List<Integer> t = new ArrayList<Integer>();
List<List<Integer>> ans = new ArrayList<List<Integer>>();
public List<List<Integer>> subsets(int[] nums) {
dfs(0, nums);
return ans;
}
public void dfs(int cur, int[] nums) {
if (cur == nums.length) {
ans.add(new ArrayList<Integer>(t));
return;
}
t.add(nums[cur]);
dfs(cur + 1, nums);
t.remove(t.size() - 1);
dfs(cur + 1, nums);
}
}