LeetCode 78.子集 和 46.全排列

2021-09-30  本文已影响0人  陈陈chen

1、题目

78题和46题可以一起看,一起做对比。两道题目都是用回溯算法求。但是递归参数有点区别。
78题:


image.png

46题:


image.png

2、分析

用回溯算法。可以结合后面的代码来看图
78题:


image.png

46题:


image.png

3、代码

78题代码:

class Solution {
    List<List<Integer>> res = new LinkedList<>();
    public List<List<Integer>> subsets(int[] nums) {
        LinkedList<Integer> tack = new LinkedList<>();
        backTack(nums, 0, tack);
        return res;
    }

    public void backTack(int[] nums, int start, LinkedList<Integer> tack){
        res.add(new LinkedList<>(tack));
        //从start开始循环
        for(int i = start; i < nums.length; i++){
            tack.add(nums[i]);
            backTack(nums, i + 1, tack);
            tack.removeLast();
        }
    }
}

46题代码:

class Solution {
    List<List<Integer>> res = new LinkedList<>();
    public List<List<Integer>> permute(int[] nums) {
        LinkedList<Integer> tack = new LinkedList<>();
        dfs(nums, tack);
        return res;
    }

    private void dfs(int[] nums, LinkedList<Integer> tack){
        if(tack.size() == nums.length){
            res.add(new LinkedList<Integer>(tack));
            return;
        }
        //每一次都从0开始循环
        for(int i = 0; i < nums.length; i++){
            if(tack.contains(nums[i])) continue;
            tack.add(nums[i]);
            dfs(nums, tack);
            tack.removeLast();
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读