又一个回溯法的题目,做完了排列,这个是子集
区别就是:
一边track要一边把路径加入结果
二是要定一个序号,这个序号后面的才是可选的值,这个自己画一个树应该就能感觉出来
例如第一个选2,后面可选的就只有3
还有一个问题就是这个题不存在结束条件,写出来也是白写,因为已经在for循环中已经附带了什么时候该结束了
一开始自己写的代码如下:
class Solution { List<List<Integer>> res=new LinkedList<>();//结果集 public List<List<Integer>> subsets(int[] nums) { List<Integer> track=new LinkedList<>(); backtracking(0,nums,track); return res; } void backtracking(int startIndex,int[] nums,List<Integer> track) { if(startIndex==nums.length) { res.add(new LinkedList<>(track));//一开始这里忘写了 return; }//终止条件,其实不用写 res.add(new LinkedList<>(track));//添加结果 for(int i=startIndex;i<nums.length;i++) { track.add(nums[i]); backtracking(i+1,nums,track); track.remove(track.size()-1); } } }
修改后应该是:
class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> res = new ArrayList<>(); backtrack(0, nums, res, new ArrayList<Integer>()); return res; } private void backtrack(int i, int[] nums, List<List<Integer>> res, ArrayList<Integer> tmp) { res.add(new ArrayList<>(tmp)); for (int j = i; j < nums.length; j++) { tmp.add(nums[j]); backtrack(j + 1, nums, res, tmp); tmp.remove(tmp.size() - 1); } } }