Leetcode 0216:組み合わせ合計III

タイトル説明:

次の条件が当てはまるように、合計がnになるk個の有効な組み合わせをすべて見つけ
ます。1から9までの数のみが使用されます。
各番号は最大で1回使用されます。
考えられるすべての有効な組み合わせのリストを返します。リストに同じ組み合わせを2回含めることはできません。また、組み合わせは任意の順序で返すことができます。

例1:

入力:k = 3、n = 7
出力:[[1,2,4]]
説明:
1 + 2 + 4 = 7
他に有効な組み合わせはありません。

例2:

入力:k = 3、n = 9
出力:[[1,2,6]、[1,3,5]、[2,3,4]]
説明:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
他に有効な組み合わせはありません。

例3:

入力:k = 4、n = 1
出力:[]
説明:有効な組み合わせはありません。[1,2,1]は、1が2回使用されているため、無効です。

例4:

入力:k = 3、n = 2
出力:[]
説明:有効な組み合わせはありません。

例5:

入力:k = 9、n = 45
出力:[[1,2,3,4,5,6,7,8,9]]
説明:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
他に有効な組み合わせはありません。

制約:

2 <= k <= 9
1 <= n <= 60

時間計算量:O(C 9 k O(\ mathrm {C} _9 ^ kO C9K* k)
空間の複雑さ:O(k)O(k)O k
DFSバックトラッキング:
ブルートフォースは、9つの数値から選択されたすべてのkスキームを検索し、合計がnに等しいすべてのスキームを記録します。
二重カウントを回避するために、最後に選択された数値がxの場合、x +1から現在の数値の列挙を開始します。

時間計算量分析:9つの数値からkを選択し、合計C 9 k \ mathrm {C} _9 ^ kC9K各計画を記録するにはO(k)時間がかかるため、時間計算量はO(C 9 k \ mathrm {C} _9 ^ kC9K * k)。

class Solution {
    
    
    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
    
    
        dfs(1, new ArrayList<Integer>(), k, n);
        return res;
    }
    
    private void dfs(int next, List<Integer> path, int k, int remain){
    
    
        if(k == path.size() && remain == 0){
    
    
            res.add(new ArrayList<Integer>(path));
            return;
        }
        for(int i = next; i <=9; i++){
    
    
            path.add(i);
            dfs(i+1, path, k, remain-i);
            path.remove(path.size()-1);
        }
    }
}

おすすめ

転載: blog.csdn.net/weixin_43946031/article/details/113816141