回溯解法思路:
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)来添加li2li1.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();} }
}