题目:
给你一个整数数组 nums
,数组中的元素互不相同 。返回该数组所有可能的子集(幂集)。
解集不能包含重复的子集。你可以按任意顺序返回解集。
思路:
- 该题目是回溯类型的一种,相同类型的题目还有全排列等等。但是这道题还是和全排列有些不同的
- 因为求子集,我们从第一个元素出发,所有情况都要加入到
res集合
中,没有临界条件,等curindex
超过数组长度nums.length
时,就自动退出方法 - 因为每种情况都是在上一个元素选择或不选择的基础上来的,所以
dfs
方法中的循环每次都需要从curindex
开始,一直到数组末尾结束。遍历过程中遇到的每个元素都有选择或不选择两种情况。 - 本题可以和全排列问题结合着做,印象会更深刻一点。
以下为代码+注释:
private List<Integer> cur = new ArrayList<>();
private List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> subsets(int[] nums) {
// 回溯
dfs(nums, 0);
return res;
}
public void dfs(int[] arr, int curindex){
// 先将该元素加入集合中
res.add(new ArrayList<>(cur));
// 该题目不需要临界条件,因为所有遍历到的情况都需要加入到结果集中
// 等到索引超过数组长度就自动退出
// 从当前curindex位置一直遍历到最后一个
// 每遍历一个数字,都有两个情况,要么选,要么不选
// 之后,再在这一层的基础上对后续的数组值进行选择是否加入
for(int i = curindex; i < arr.length; i++){
cur.add(arr[i]);
dfs(arr, i + 1);
// 回溯,删除最后一个元素
cur.remove(cur.size() - 1);
}
}
笔者也在不断学习中,如有错误,欢迎指正!