78. 子集

194 阅读1分钟

题目介绍

力扣78题:leetcode-cn.com/problems/su…

image.png

回溯

我们回顾一下回溯算法的模板:

result = []
public void backtrack(路径, 选择列表){
    if (满足结束条件) {
        result.add(路径);
        return;
    }    
    for (选择 in 选择列表) {
        做选择;
        backtrack(路径, 选择列表);
        撤销选择;
    }
}    

直接套用模板,完成代码如下:

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
        List<Integer> track = new ArrayList<>();
        backTrack(nums, 0, track);
        return res;
    }
    public void backTrack(int[] nums, int start, List<Integer> track) {
        res.add(new ArrayList<Integer>(track));
        for(int i = start; i < nums.length; i++) {
           //做选择
           track.add(nums[i]);
           //递归
           backTrack(nums, i + 1, track);
           //回溯
           track.remove(track.size() - 1);
        }
    }
}

可以看见,对 res 的更新是一个前序遍历,也就是说,res 就是树上的所有节点:

image.png

注意:自己问题使用回溯算法时,要用 start 参数排除已选择的数字。