Descrição do título:
Encontre todas as combinações válidas de k números que somam n de forma que as seguintes condições sejam verdadeiras:
Somente os números de 1 a 9 são usados.
Cada número é usado no máximo uma vez.
Retorne uma lista de todas as combinações válidas possíveis. A lista não deve conter a mesma combinação duas vezes e as combinações podem ser retornadas em qualquer ordem.
Exemplo 1:
Entrada: k = 3, n = 7
Saída: [[1,2,4]]
Explicação:
1 + 2 + 4 = 7
Não há outras combinações válidas.
Exemplo 2:
Entrada: k = 3, n = 9
Saída: [[1,2,6], [1,3,5], [2,3,4]]
Explicação:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
Não há outras combinações válidas.
Exemplo 3:
Entrada: k = 4, n = 1
Saída: []
Explicação: Não há combinações válidas. [1,2,1] não é válido porque 1 é usado duas vezes.
Exemplo 4:
Entrada: k = 3, n = 2
Saída: []
Explicação: Não há combinações válidas.
Exemplo 5:
Entrada: k = 9, n = 45
Saída: [[1,2,3,4,5,6,7,8,9]]
Explicação:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
Não há outras combinações válidas.
Restrições:
2 <= k <= 9
1 <= n <= 60
Complexidade de tempo: O (C 9 k O (\ mathrm {C} _9 ^ kO ( C9k* k)
Complexidade do Espaço: O (k) O (k)O ( k )
DFS Backtracking:
Força bruta pesquisa todos os k esquemas selecionados a partir de 9 números e registra todos os esquemas cuja soma é igual a n.
Para evitar a contagem dupla, se o último número selecionado for x, então começamos a enumerar o número atual de x + 1.
Análise de complexidade de tempo: escolha k de 9 números, um total de C 9 k \ mathrm {C} _9 ^ kC9kLeva tempo O (k) para registrar cada plano, então a complexidade do tempo é 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);
}
}
}