Leetcode 46. Tableau complet (méthode classique de retour arrière)

Jeudi 18 mars 2021, il fait beau [Ne pas se lamenter sur le passé, ne pas gaspiller le présent, ne pas craindre l’avenir]


1. Introduction

46. ​​Tableau complet
Insérez la description de l'image ici

2. Solution du problème (rétrospective de Dafa)

2.1 Méthode de tableau temporaire

class Solution {
    
    
public:
    unordered_set<int> uset; // 利用哈希表判断元素是否遍历过了
    vector<vector<int>> res;
    vector<vector<int>> permute(vector<int>& nums) {
    
    
        vector<int> tmp; // 临时数组,存放每一个排列的结果
        dfs(nums,tmp,0);
        return res;
    }

    void dfs(vector<int>& nums, vector<int>& tmp, int n){
    
    
        // 终止条件,所有位都遍历完了
        if(n==nums.size()){
    
    
            res.push_back(tmp);
            return;
        }
        for(int num:nums){
    
    
            // 如果 num 还没有遍历
            if(uset.find(num)==uset.end()){
    
    
                // 加入哈希表和临时数组
                uset.insert(num);
                tmp.push_back(num);

                // 继续遍历下一位
                dfs(nums,tmp,n+1);

                // 遍历完之后记得还原,避免分支污染
                uset.erase(num);
                tmp.pop_back();
            }
        }
    }
};

C'est la réponse que j'ai écrite quand je l'ai fait pour la première fois, et c'est plus facile à comprendre. Bien qu'elle puisse être adoptée, elle prend plus de temps que la méthode officielle (la méthode d'échange ci-dessous).

2.2 Méthode d'échange

class Solution {
    
    
public:
    void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){
    
    
        // 所有数都填完了
        if (first == len) {
    
    
            res.emplace_back(output);
            return;
        }
        for (int i = first; i < len; ++i) {
    
    
            // 动态维护数组
            swap(output[i], output[first]);
            // 继续递归填下一个数
            backtrack(res, output, first + 1, len);
            // 撤销操作
            swap(output[i], output[first]);
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
    
    
        vector<vector<int> > res;
        backtrack(res, nums, 0, (int)nums.size());
        return res;
    }
};

La méthode d'échange est également une méthode standard pour résoudre le problème de l'arrangement complet.Bien que le code soit simple, il faut un peu d'effort pour le comprendre.

L'image suivante aide à comprendre:
Insérez la description de l'image ici

* Analyse de complexité

Insérez la description de l'image ici
Le calcul de la complexité temporelle est plus difficile à comprendre.Vous pouvez vous référer à l'image suivante pour comprendre:
Insérez la description de l'image ici
additionnez le nombre d'échanges de chaque couche, vous pouvez obtenir le nombre total d'appels:
Insérez la description de l'image ici
Ensuite, vous pouvez dériver la formule ci-dessus.


références

https://leetcode-cn.com/problems/permutations/solution/quan-pai-lie-by-leetcode-solution-2/

https://blog.csdn.net/u013905744/article/details/113779407

Je suppose que tu aimes

Origine blog.csdn.net/m0_37433111/article/details/114968607
conseillé
Classement