Leetcode 78 子集

 

 

又一个回溯法的题目,做完了排列,这个是子集

区别就是:

一边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);
        }
    }
}

 

posted @ 2021-03-10 16:47  将来的事  阅读(30)  评论(0编辑  收藏  举报