回溯day1

77. 组合

class Solution {
    List<List<Integer>> res;
    LinkedList<Integer> path;
    public List<List<Integer>> combine(int n, int k) {
        res = new ArrayList<>();
        path = new LinkedList<>();
        backtracking(n, k, 1);
        return res;
    }
    private void backtracking(int n, int k, int s) {
        if (path.size() == k) {
            res.add(new ArrayList(path));
            return;
        }
        //for (; s <= n; s++) {
        for (; s <= n - (k - path.size()) + 1; s++) {
            path.add(s);
            backtracking(n, k, s + 1);
            path.removeLast();
        }
     }
}

216. 组合总和 III

class Solution {
    
    private List<List<Integer>> res;
    //removeLast() java.util.LinkedList;
    private LinkedList<Integer> path;
    private int sum;
    public List<List<Integer>> combinationSum3(int k, int n) {
        res = new ArrayList<>();
        path = new LinkedList<>();
        sum = 0;
        if (k > 9 || k < 1) return res;
        int upper = 9, lower = 1, max = 0, min = 0;
        for (int i = 0; i < k; i++) {
            max += upper;
            upper--;
            min += lower;
            lower++;
        }
        if (n > max || n < min) return res;
        backtracking(n, k, 1);
        return res;
    }
    private void backtracking(int n, int k, int s) {
        if (path.size() > k) return;
        if (path.size() == k && sum == n) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (; s <= 9; s++) {
            path.add(s);
            sum += s;
            backtracking(n, k, s + 1);
            path.removeLast();
            sum -= s;
        }
    }
}

 

参考:programmercarl.com

 

posted @ 2022-04-13 18:27  一梦两三年13  阅读(15)  评论(0)    收藏  举报