Leetcode 0216: Soma de Combinação III

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

Acho que você gosta

Origin blog.csdn.net/weixin_43946031/article/details/113816141
Recomendado
Clasificación