子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
分析
和 全排列 的题很像,也可以理解成三成嵌套,不过每一层循环的起点是上一层对应位置+1,这样避免出现123,132这种重复情况
还是给出处理流程
- 遍历开始前,先把[]加入list
- 第一层i1=0,”1“
- 第二层i2=i1+1=1,”12“
- 第三层i3=i2+1=2,”123“
- 回溯到第二层,i2++后i2=2,”13“
- 进入到第三层由于i3=i2+1=3,到边界之外了,直接返回到第二层
- 第二层i2++后,i2=3,越界返回第一层
- 第一层i1++后,i1=2,”2“
- 第二层i2=i1+1=2,“23“,回退
- 第一层i1++后,i1=3,”3“,退出
代码
class Solution {
//需要好好理解!!!
//可以跑一边代码对照输出顺序理解实现过程
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
if(nums.length ==0){
return list;
}
backtrack(list,new ArrayList<Integer>(),nums,0);
return list;
}
private void backtrack(List<List<Integer>> list,List<Integer> temp,int[] nums,int begin){
list.add(new ArrayList<Integer>(temp));
for(int i=begin;i<nums.length;i++){
temp.add(nums[i]);
backtrack(list,temp,nums,i+1);
temp.remove(temp.size()-1);
}
}
}