Maison > Java > javaDidacticiel > le corps du texte

LeetCode DayBackTracking Partie 1

WBOY
Libérer: 2024-07-16 17:45:48
original
624 Les gens l'ont consulté

77. Combinaisons

Étant donné deux entiers n et k, renvoie toutes les combinaisons possibles de k nombres choisis dans la plage [1, n].

Vous pouvez renvoyer la réponse dans n'importe quel ordre.

Exemple 1 :

Entrée : n = 4, k = 2
Sortie : [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
Explication : Il y a 4 choix 2 = 6 combinaisons totales.
Notez que les combinaisons ne sont pas ordonnées, c'est-à-dire que [1,2] et [2,1] sont considérées comme la même combinaison.
Exemple 2 :

Entrée : n = 1, k = 1
Sortie : [[1]]
Explication : Il y a 1 choix 1 = 1 combinaison totale.

Contraintes :

1 <= n <= 20
1 <= k <= n

Mauvais code

    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> list = new ArrayList<>();

        List<Integer> nums = new ArrayList<>();

        backTracking(list,1,1,n,k,nums);

        return list;
    }

    public void backTracking(List<List<Integer>> list, int base,int size,int n, int k,List<Integer> nums)
    {
        if(size>k){
            list.add(new ArrayList<>(nums));
            return;
        }

        for(int i=base; base<n; i++ ){
            nums.add(i);
            backTracking(list,i+1,size+1,n,k,nums);
            nums.remove(nums.size()-1);
        }
    }



</p>
<p>Mais cela provoque une erreur de dépassement de limite de mémoire dans LeetCode</p>

<p>Il y a quelques erreurs ici. </p>

<p><img src="https://img.php.cn/upload/article/000/000/000/172112315134776.png" alt="Image description" loading="lazy"    style="max-width:90%"  style="max-width:90%"></p>

<p>1, la condition de boucle est fausse, nous devrions utiliser i mais le code ci-dessus utilise base comme condition d'évaluation de fin.<br>
2, le bon seuil peut être n et si i<n, il manquera la possibilité que lorsque n soit un élément de la combinaison potentielle. </p>
<h2>
  
  
  Code des amendes
</h2>


<pre class="brush:php;toolbar:false">    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> list = new ArrayList<>();

        List<Integer> nums = new ArrayList<>();

        backTracking(list,1,1,n,k,nums);

        return list;
    }

    public void backTracking(List<List<Integer>> list, int base,int size,int n, int k,List<Integer> nums)
    {
        if(size>k){
            list.add(new ArrayList<>(nums));
            return;
        }

        for(int i=base; i<=n; i++ ){
            nums.add(i);
            backTracking(list,i+1,size+1,n,k,nums);
            nums.remove(nums.size()-1);
        }
    }
Copier après la connexion
    List<List<Integer>> list = new LinkedList<>();
    List<Integer> nums = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(1,n,k);
        return list;
    }

    public void backTracking(int base, int n, int k)
    {
        if(nums.size()==k){
            list.add(new ArrayList<>(nums));
            return;
        }

        for(int i=base; i<=n; i++ ){
            nums.add(i);
            backTracking(i+1,n,k);
            nums.removeLast();
        }
    }
Copier après la connexion

Image description
Il y a ici quelques différences dont nous pouvons dépendre directement de la taille de la liste de chemins globale mais ici, la taille des nombres est la bonne réponse !!!
Avant la taille n'est pas la bonne réponse car nous n'avons pas ajouté le dernier élément à la liste des chemins.

Il semble que l'adoption de variables globales puisse entraîner une diminution des performances ?

Il s'agit d'une méthode plus générale mais la question demande d'utiliser uniquement des nombres <= 9 et >= 1.
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> path = new LinkedList<>();
        backTracking(list, path, 1, k, n);
        return list;

    }

    public void backTracking(List<List<Integer>>list,  List<Integer> path, 
    int start, int k, int n){
        if(path.size() == k){
            int sum = path.stream().reduce(0,Integer::sum);
            if(sum == n){
                list.add(new ArrayList<>(path));
            }
        }
        for(int i=start ; i<=n; i++){
            int sum = path.stream().reduce(0,Integer::sum);
            if(sum>n){
                break;
            }
            path.add(i);
            backTracking(list,path,i+1, k,n );
            path.remove(path.size()-1);
        }
    }
Copier après la connexion
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> path = new LinkedList<>();
        backTracking(list, path, 1, k, n);
        return list;

    }

    public void backTracking(List<List<Integer>>list,  List<Integer> path, 
    int start, int k, int n){
        if(path.size() == k){
            int sum = path.stream().reduce(0,Integer::sum);
            if(sum == n){
                list.add(new ArrayList<>(path));
            }
        }
        for(int i=start ; i<=9; i++){
            int sum = path.stream().reduce(0,Integer::sum);
            if(sum>n){
                break;
            }
            path.add(i);
            backTracking(list,path,i+1, k,n );
            path.remove(path.size()-1);
        }
    }
Copier après la connexion

Il semble que certains calculs redondants soient utilisés pour la somme

    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> path = new LinkedList<>();
        backTracking(list, path, 1, k, n, 0);
        return list;

    }

    public void backTracking(List<List<Integer>>list,  List<Integer> path, 
    int start, int k, int n, int sum){
        if(path.size() == k){
            if(sum == n){
                list.add(new ArrayList<>(path));
            }
        }
        for(int i=start ; i<=9; i++){
            sum += i;
            if(sum>n){
                break;
            }
            path.add(i);
            backTracking(list,path,i+1, k,n, sum);
            path.remove(path.size()-1);
            sum -= i;
        }
    }
Copier après la connexion

17. Combinaisons de lettres d'un numéro de téléphone

Étant donné une chaîne contenant des chiffres de 2 à 9 inclus, renvoie toutes les combinaisons de lettres possibles que le nombre pourrait représenter. Renvoyez la réponse dans n'importe quel ordre.

Un mappage des chiffres aux lettres (tout comme sur les boutons du téléphone) est donné ci-dessous. Notez que 1 ne correspond à aucune lettre.

Image description

Exemple 1 :

Saisie : chiffres = "23"
Sortie : ["ad","ae","af","bd","be","bf","cd","ce","cf"]
Exemple 2 :

Saisie : chiffres = ""
Sortie : []
Exemple 3 :

Saisie : chiffres = "2"
Sortie : ["a","b","c"]

Contraintes :

0 <= chiffres.longueur <= 4
digits[i] est un chiffre compris dans la plage ['2', '9'].

    public List<String> letterCombinations(String digits) {
        List<String> list = new LinkedList<>();
        if(digits.length() == 0){
            return list;
        }
        String[] arr = {
            "",
            "",
            "abc",
            "def",
            "ghi",
            "jkl",
            "mno",
            "pqrs",
            "tuv",
            "wxyz"
        };
        backTracking(list, new StringBuilder(), 0, digits, arr);
        return list;

    }

    public void backTracking(List<String> list, StringBuilder s, int start, String digits, String[] arr){
        if(start == digits.length()){
            list.add(s.toString());
            return;
        }

        int num = digits.charAt(start)-'0';
        String button = arr[num];
        for(int i=0; i<button.length(); i++){
            s.append(button.charAt(i));
            backTracking(list, s, start+1, digits, arr);
            s.setLength(s.length()-1);
        }
    }
</p>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!