力扣:78. 子集
回溯解法思路:
1.跟前面的组合题目有相同的点,主要区别在于:组合题目是遍历到符合条件的组合时加入li1集合中,子集题目是每递归一次就要把结果加入到li1集合中,并遍历但nums数组的最后。其他点和组合问题一样。
class Solution {
//接收所有的子集
List<List<Integer>> li1=new ArrayList<>();
//单个子集
List<Integer> li2=new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
//调用回溯函数
huisu(nums,0);
return li1;
}
//回溯函数
public void huisu(int[] nums,int startIndex){
//将每个自己添加到li1函数中,注意add()中要用new ArrayList<>(li2)来添加li2
li1.add(new ArrayList<>(li2));
//终止条件,要startIndex来规定遍历的位置等于nums的长度时结束这次循环。
if(startIndex==nums.length){
return ;
}
//循环遍历全部的子集
for(int i=startIndex;i<nums.length;i++){
//将num的元素添加到li2中
li2.add(nums[i]);
//递归来嵌套for循环来遍历全部子集
huisu(nums,i+1);
//遍历完一条路后,进行回溯操作来寻找另一条路。
li2.removeLast();
}
}
}