leetcode77_组合

我一开始的写法:

class Solution {
    private List<List<Integer>> ans = new ArrayList();
    private List<Integer> list = new ArrayList();
    private void backtracking(int n, int k, int depth, boolean[] used) {
        if(depth == k) {
            System.out.println(depth);
            System.out.println(list);
            ans.add(list);
            return;
        }
        for(int i = 1; i <= n; i++) {
            if(!used[i]) {
                used[i] = true;
                list.add(i);
                depth += 1;
                backtracking(n, k, depth, used);
                depth -=1;
                list.remove(list.size()-1);
                used[i] = false;
            }
        }
    }
    public List<List<Integer>> combine(int n, int k) {
        boolean[] used = new boolean[n+1];
        backtracking(n, k, 0, used);
        return ans;
    }
}

最大的问题出现对java语法的问题:

class Solution {
    private List<List<Integer>> ans = new ArrayList();
    private List<Integer> list = new ArrayList();
    private void backtracking(int n, int k, int startIdx) {
        if(list.size() == k) {
            ans.add(new ArrayList<>(list));
            return;
        }
        for(int i = startIdx; i <= n-(k-list.size())+1; i++) {
            list.add(i);
            backtracking(n, k, i+1);
            list.remove(list.size()-1);
        }
        return;
    }
    public List<List<Integer>> combine(int n, int k) {
        backtracking(n, k, 1);
        return ans;
    }
}

对于一个外部的ArrayList,你必须要新new一个ArrayList插入进去,不能直接把现有的ArrayList插入。因为你是引入传递,存入只是地址,当它清空之后自然也就清空了。

// 一个n叉树的遍历你都写不出来?垃圾!
// k控制的是深度,n控制的是宽度
// 深度不应该是由循环来控制的,应该是用遍历的深度来控制的,也就是回溯函数中不会写到对深度的循环

posted @ 2022-04-19 13:58  明卿册  阅读(26)  评论(0编辑  收藏  举报