8月3日:子集

题目如下:

8月3日:子集

这是一道求排列组合问题。求排列组合问题常用思路是递归和回溯思想,然后好不容易看懂了解题方法开始自己写,写完以后就是这个样子

8月3日:子集

然后我又看了一下题解,感觉我写的和题解基本一样了,就方法名称不一样(难道方法名不一样还有影响嘛?),然后我再仔细检查了一下两者之间的差别,还真写个地方不一样

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);

        }

    }

}

8月3日:子集