LeetCode216. 组合总和 III

☆☆思路:做完1 和 2之后,直接套模板就完了。刚开始可以把1到9放入数组中,然后回溯搜索。 AC后再去掉数组进行优化。

class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> res = new ArrayList<>();

        dfs(k, n, 1, new ArrayList<>(), res);

//        dfs1(k, n, 1, new ArrayList<>(), res);
        return res;
    }
    private void dfs(int k, int n, int start, List<Integer> list, List<List<Integer>> res) {
        if (list.size() == k) {
            if (n == 0) {
                res.add(new ArrayList<>(list));
            }
            return;
        }
        for (int i = start; i <= 9; i++) {
            if (n < i) break;
            list.add(i);
            dfs(k, n - i, i + 1, list, res);
            list.remove(list.size() - 1);
        }
    }

    // 回溯做选择
    private void dfs1(int k, int n, int start, List<Integer> list, List<List<Integer>> res) {
        if (list.size() == k) {
            if (n == 0) {
                res.add(new ArrayList<>(list));
            }
            return;
        }
        if (start > 9) return; // 需要放在下边,否则用例k=9,n=45过不了,[[1,2,3,4,5,6,7,8,9]]

        list.add(start);
        dfs1(k, n - start, start + 1, list, res);
        list.remove(list.size() - 1);
        dfs1(k, n, start + 1, list, res);
    }
}
原文地址:https://www.cnblogs.com/HuangYJ/p/14199091.html