8月3日:子集
题目如下:
这是一道求排列组合问题。求排列组合问题常用思路是递归和回溯思想,然后好不容易看懂了解题方法开始自己写,写完以后就是这个样子
然后我又看了一下题解,感觉我写的和题解基本一样了,就方法名称不一样(难道方法名不一样还有影响嘛?),然后我再仔细检查了一下两者之间的差别,还真写个地方不一样
我add的是函数传进来的list,而题解是用的res.add(new ArrayList<Integer>(list));
原来如此,因为形参传进去的都是引用类型的变量,list引用所指向的ArrayList对象当递归完成后又会被回溯成原始的空集合,所以我代码的结果是全部为空,题解中用new ArrayList<Integer>(list);每次创建一个新的ArrayList对象,所以正确。
最终修改后的正确答案如下:
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> listtemp = new ArrayList<>();
dfs(0,nums,res,listtemp);
return res;
}
public void dfs(int i,int[] nums,List<List<Integer>> res,List<Integer> list){
res.add(ArrayList<Integer>(list));
for(int j=i;j<nums.length;j++){
list.add(nums[j]);
dfs(j+1,nums,res,list);
list.remove(list.size()-1);
}
}
}