タイトル説明:
次の条件が当てはまるように、合計が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);
}
}
}