题目来源:https://leetcode.cn/problems/TVdhkn/
大致题意:
给一个不含重复元素的数组(长度不大于 10),求出数组的所有子集
思路
题目中限制了数组长度,于是可以使用 dfs + 回溯的思路枚举出所有子集
DFS + 回溯
- 从第一个元素出发,使用 list 存下当前子集
- 每次遍历到一个元素时,可以选择跳过当前元素,直接调用 dfs 遍历下一个位置;也可以选择添加当前元素到 list,再调用 dfs 遍历下一个位置(此时在跳出 dfs 后,需要回溯,将当前元素从 list 中取出)
- 若数组已经遍历完,则将当前 list 代表的子集放入答案中
代码:
class Solution {
List<List<Integer>> ans;
public List<List<Integer>> subsets(int[] nums) {
ans = new ArrayList<>();
dfs(nums, 0, new ArrayList<>());
return ans;
}
public void dfs(int[] nums, int i, List<Integer> list) {
// 数据遍历完,将当前 list 内容表示的子集加入答案
if (i == nums.length) {
ans.add(new ArrayList<>(list));
return;
}
// 跳过当前元素
dfs(nums, i + 1, list);
// 添加当前元素
list.add(nums[i]);
dfs(nums, i + 1, list);
// 回溯,取出当前元素
list.remove(list.size() - 1);
}
}