[Likou] 216. Somme combinée III <Retour en arrière, Taille en arrière>

【Bouton riche】 216. Somme combinée III

Recherchez toutes les combinaisons de k nombres dont la somme donne n de telle sorte que les conditions suivantes soient remplies :
seuls les chiffres de 1 à 9 sont utilisés, chaque chiffre est utilisé au plus une fois et une liste de toutes les combinaisons valides possibles est renvoyée. La liste ne peut pas contenir deux fois la même combinaison et les combinaisons peuvent être renvoyées dans n'importe quel ordre.

Exemple 1 :
Entrée : k = 3, n = 7
Sortie : [[1,2,4]]
Explication :
1 + 2 + 4 = 7
Il n'y a pas d'autre combinaison correspondante.

Exemple 2 :
Entrée : k = 3, n = 9
Sortie : [[1,2,6], [1,3,5], [2,3,4]]
Explication :
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
Il n'existe aucune autre combinaison correspondante.

Exemple 3 :
Entrée : k = 4, n = 1
Sortie : []
Explication : Aucune combinaison valide n'existe.
En utilisant 4 nombres différents dans la plage [1,9], la plus petite somme que nous pouvons obtenir est 1+2+3+4 = 10, puisque 10 > 1, il n'y a pas de combinaison valide.

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

répondre

trace :
insérer la description de l'image ici

import java.util.*;

class Solution {
    
    
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combinationSum3(int k, int n) {
    
    
        backTracking(n, k, 1, 0);
        return result;
    }

    private void backTracking(int targetSum, int k, int startIndex, int sum) {
    
    

        if (path.size() == k) {
    
    
            if (sum == targetSum) {
    
    
                result.add(new ArrayList<>(path));
            }
            return;
        }

        for (int i = startIndex; i <= 9 ; i++) {
    
    
            path.add(i);
            sum += i;
            backTracking(targetSum, k, i + 1, sum);
            //回溯
            path.removeLast();
            //回溯
            sum -= i;
        }
    }
}

taille

  • Si Sum est supérieur à TargetSum, il n’est pas nécessaire de revenir en arrière.
  • En termes de quantité, si k nombres sont nécessaires, il n'est pas nécessaire de revenir en arrière s'il n'y a pas assez de k nombres. k - path.size()Combien de nombres sont nécessaires dans la couche actuelle ?
    insérer la description de l'image ici
import java.util.*;

class Solution {
    
    
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combinationSum3(int k, int n) {
    
    
        backTracking(n, k, 1, 0);
        return result;
    }

    private void backTracking(int targetSum, int k, int startIndex, int sum) {
    
    
        // 减枝
        if (sum > targetSum) {
    
    
            return;
        }

        if (path.size() == k) {
    
    
            if (sum == targetSum) {
    
    
                result.add(new ArrayList<>(path));
            }
            return;
        }

        // 减枝 9 - (k - path.size()) + 1
        for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
    
    
            path.add(i);
            sum += i;
            backTracking(targetSum, k, i + 1, sum);
            //回溯
            path.removeLast();
            //回溯
            sum -= i;
        }
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_44033208/article/details/132499644
conseillé
Classement