1. 程式人生 > 實用技巧 >LeetCode216. 組合總和 III

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); } }