Leetcode ブラッシング問題 (配列リスト バックトラッキング法) 20 個の結合合計 III

216. 合算和Ⅲ

合計すると n になる k 個の数値のすべての組み合わせを見つけます。組み合わせには 1 ~ 9 の正の整数のみが使用でき、各組み合わせで数字を繰り返すことはできません。
説明:
すべての数値は正の整数です。
ソリューション セットには重複した組み合わせを含めることはできません。

class Solution {
    
    
    // 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
    // 内存消耗:37 MB, 在所有 Java 提交中击败了79.23%的用户
    //回溯法
    public List<List<Integer>> combinationSum3(int k, int n) {
    
    
        Deque<Integer> dp = new ArrayDeque<>();
        List<List<Integer>> res = new ArrayList<>();
        dfs(k, n, 1, dp, res);
        return res;
    }
     public void dfs(int k, int n, int tar, Deque<Integer> dp, List<List<Integer>> res) {
    
    
         if(k == 0 && n ==0){
    
    
             res.add(new ArrayList<>(dp));
             return;
         }
         if(k == 0 || n <= 0){
    
    
             return;
         }
         if(tar > 9){
    
    
             return;
         }
         //不要当前项
         dfs(k, n, tar + 1, dp, res);
         //要当前项
         dp.addLast(tar);
         dfs(k - 1, n - tar, tar + 1, dp, res);
         dp.removeLast();
         return;
    }
}

Guess you like

Origin blog.csdn.net/qq_38754625/article/details/108527941