[Leetcode 60 days with brush] Algorithme de backtracking day24 - 77. Combinaison

 


 Base théorique :

Qu'est-ce que le retour en arrière ?

La méthode de retour arrière peut également être appelée méthode de recherche de retour arrière, qui est une méthode de recherche.

Problèmes résolus par retour en arrière

La méthode de backtracking peut généralement résoudre les problèmes suivants :

  • Problème de combinaison : trouver l'ensemble de k nombres dans N nombres selon certaines règles
  • Problème de coupe : Il existe plusieurs manières de couper une ficelle selon certaines règles
  • Problème de sous-ensemble : Combien de sous-ensembles éligibles y a-t-il dans un ensemble de N nombres ?
  • Problème d'arrangement : N nombres sont arrangés selon certaines règles, il y a plusieurs façons d'arrangement
  • Problèmes de tableau : N Queens, résolution de Sudoku, etc.

Comment comprendre le retour en arrière ?

Les problèmes résolus par la méthode de backtracking peuvent être abstraits dans une structure arborescente Oui, je veux dire que tous les problèmes résolus par la méthode de backtracking peuvent être abstraits dans une structure arborescente !

Étant donné que la méthode de retour en arrière consiste à rechercher de manière récursive des sous-ensembles dans l'ensemble, la taille de l'ensemble constitue la largeur de l'arbre, la profondeur de la récursivité et la profondeur de l'arbre .

La récursivité doit avoir une condition de terminaison, elle doit donc être un arbre de hauteur limitée (arbre N-aire).


  sujet:

77. Combinaison

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

Vous pouvez retourner les réponses dans  n'importe quel ordre  .

Exemple 1:

Entrée : n = 4, k = 2
 Sortie :
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

Exemple 2 :

Entrée : n = 1, k = 1
 Sortie : [[1]]

indice:

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

Processus de réflexion et points de connaissance : 

Chaque fois qu'un élément est sélectionné dans la collection, la plage sélectionnable diminue au fur et à mesure de la sélection et la plage sélectionnable est ajustée .

On peut trouver sur la figure que n est équivalent à la largeur de l'arbre, et k est équivalent à la profondeur de l'arbre .

Chaque fois qu'un nœud feuille est recherché dans le graphe, nous avons trouvé un résultat .

Cela équivaut à n'avoir qu'à collecter les résultats atteignant les nœuds feuilles pour obtenir l'ensemble combiné de k nombres sur n nombres.


 répondre:

class Solution {
private:
    vector<vector<int>> result; // 存放符合条件结果的集合
    vector<int> path; // 用来存放符合条件结果
    void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i <= n; i++) {
            path.push_back(i); // 处理节点
            backtracking(n, k, i + 1); // 递归
            path.pop_back(); // 回溯,撤销处理的节点
        }
    }
public:
    vector<vector<int>> combine(int n, int k) {
        result.clear(); // 可以不写
        path.clear();   // 可以不写
        backtracking(n, k, 1);
        return result;
    }
};


Bienvenue à aimer, marquer, commenter, vos encouragements sont la plus grande motivation pour ma création ! (๑╹◡╹)ノ"""

Déclaration de droit d'auteur : cet article est un article original du blogueur CSDN "Dumengjiu", qui suit l'accord de droit d'auteur CC 4.0 BY-SA. Pour la réimpression, veuillez joindre le lien source original et cette déclaration.
Lien d'origine : blog de Dumengjiu_blog CSDN-blogueur de domaine csdn

Guess you like

Origin blog.csdn.net/weixin_53310927/article/details/131355906