[Élagage en retour] Trouvez la combinaison de toutes les sommes dans un tableau comme cible


Préface

La question d’aujourd’hui est une douloureuse leçon. L’idée est correcte, mais les conditions du cycle sont omises. Cela peut être écrit à la main, mais ...
Insérez la description de l'image ici


sujet

Trouvez la combinaison de toutes les sommes dans un tableau comme cible

Par exemple, le tableau est [2,2,3,4] et target = 7,
alors toutes les combinaisons sont
[2,2,3], [3,4]


Idées

En
effectuant un retour en arrière sur l' élagage, en parcourant toutes les situations, la somme des questions du modèle dfs enregistre la somme temporaire, tmp enregistre la combinaison temporaire, l'index revient à la profondeur actuelle.
Si sum == target, le tmp actuel est une combinaison légale et est ajouté à l'ensemble de réponses.
Si sum + arr [index] est déjà supérieur à la cible, il n'est pas nécessaire d'ajouter arr [index] à ce moment, et de retourner directement. (Cette opération représente l'élagage)
Si index == arr.length, vous devez retourner, car le tableau sera hors limites (cela représente la vérification des conditions aux limites)

Besoin de parcourir la position de chaque tableau, et tous doivent effectuer une recherche récursive. Après la recherche, il est nécessaire de revenir en arrière pour s'assurer que toutes les combinaisons peuvent être trouvées à partir du nœud suivant.

S'il n'est parcouru qu'une seule fois, après la suppression du premier élément, il ne peut pas continuer à rechercher toutes les combinaisons de manière récursive à partir du deuxième élément.


Code

public class Solution {
    
    

	//使用Set集合来去重
    static Set<List<Integer>> res = new HashSet<List<Integer>>();
    static List<Integer> tmp = new LinkedList<Integer>();

    public static void main(String[] args) {
    
    
        int[] arr = {
    
    2,2,3,2,4,1,6,5,2,7,0,1,1,1,1,1,1,1};
        int target = 7;
        dfs(arr,target,0,0);
        printResult(res);
    }

    public static void dfs(int[] arr,int target,int sum,int index) {
    
    
        if(sum == target){
    
    
            res.add(new LinkedList<Integer>(tmp));
            return;
        }
        if(index >= arr.length) return;
        if(sum + arr[index] > target) return;
        for(int i = index; i<arr.length; i++) {
    
    
            tmp.add(arr[i]);
            dfs(arr,target,sum+arr[i],i+1);
            tmp.remove(tmp.size()-1);
        }
    }

    public static void printResult(Set<List<Integer>> res) {
    
    
        Iterator iterator = res.iterator();
        while(iterator.hasNext()) {
    
    
            System.out.println(iterator.next());
        }
    }

}


Résultats de test

Insérez la description de l'image ici
Insérez la description de l'image ici


Pour résumer

Je crois que tout le monde est familier avec le retour en arrière, mais lorsque vous écrivez soudainement sur place, vous devez avoir l'esprit plus clair avant de coder le code, réfléchissez à deux fois avant de continuer.


Insistez sur le partage, insistez sur l'originalité, les jolies filles qui aiment les blogueurs peuvent consulter le blog de la page d'accueil du blogueur!
Vos goûts et vos favoris sont ma plus grande reconnaissance pour le partage de blogs!
Adresse du blog Blogger: https://blog.csdn.net/weixin_43967679

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43967679/article/details/114708735
conseillé
Classement