Réécriture des questions-Leetcode-78. Sous-ensemble (retour arrière, DFS)

78. Sous-ensemble

Lien thématique

Source: LeetCode
Lien: https://leetcode-cn.com/problems/subsets
Copyright est la propriété de LeetCode . Pour les réimpressions commerciales, veuillez contacter l'autorisation officielle Pour les réimpressions non commerciales, veuillez indiquer la source.

Description du titre

Donnez-vous un tableau d'entiers nums, les éléments du tableau sont différents les uns des autres. Renvoie tous les sous-ensembles possibles (ensembles de puissance) de ce tableau.

L'ensemble de solutions ne peut pas contenir de sous-ensembles en double. Vous pouvez renvoyer l'ensemble de solutions dans n'importe quel ordre.

Exemple 1:

Entrée: nums = [1,2,3]
Sortie: [[], [1], [2], [1,2], [3], [1,3], [2,3], [1, 2,3]]
Exemple 2:

Entrée: nums = [0]
Sortie: [[], [0]]

Analyse thématique

1. Méthode d'expansion / méthode de violence - Expansion des nombres un par un
Vide: []
Seulement 1: (ajoutez 1 à chaque sous-ensemble) [1]
Ajoutez 2: (Ajoutez 2 à chaque sous-ensemble) [2] [1,2]
plus 3 : (ajoutez 3 à chaque sous-ensemble) [3] [1, 3] [2, 3] [1, 2, 3]
Pas besoin de considérer les problèmes en double

class Solution {
    
    
public:
    vector<vector<int>> subsets(vector<int>& nums) {
    
    
        vector<vector<int>> res;
        res.push_back(vector<int>());
        for(int num : nums){
    
    
            vector<vector<int>> subset;//存放每个数字产生新加的子集扩展 例如num为3 此时res【【】【1】【2】【1,2】】 
            for(auto vec: res){
    
    
                vector<int> temp = vec;//temp为【】或【1】或【2】或【1,2】
                temp.push_back(num);
                subset.push_back(temp);
            }
            //此时subset为每个数产生的扩展 subset【【3】【1,3】【2,3】【1,2,3】】
            for(auto s:subset){
    
    
                res.push_back(s);
            }
        }
        return res;
    }
};

2.
Longueur de récursivité de retour en arrière
0 【】
1 【1】 【2】 【3】
2 【1,2】 【1,3】 【2,3】
3 【1,2,3】
récursive à chaque fois Les éléments sont les éléments après l'élément

class Solution {
    
    
public:
    vector<vector<int>> res;
    vector<vector<int>> subsets(vector<int>& nums) {
    
    
        res.push_back(vector<int>());
        for(int length = 1; length <= nums.size(); length++){
    
    //length是长度 
            backtracking(nums, length, 0, vector<int>());
        }
        return res;
    }
    void backtracking(vector<int>& nums, int length, int index, vector<int> temp){
    
    
        if(temp.size() == length){
    
    //剪枝
            res.push_back(temp);
            return ;
        }
        for(int i = index; i < nums.size(); i++){
    
    
            temp.push_back(nums[i]);
            backtracking(nums, length, i+1,temp);
            temp.pop_back();
        }
    }
};

3.DFS profondeur-premier algorithme-récursif (mieux pour dessiner une image) d'une manière à la fin

class Solution {
    
    
public:
    vector<vector<int>> res;//2 3
    vector<vector<int>> subsets(vector<int>& nums) {
    
    
        dfs(nums, 0, vector<int>());//找到子集temp加入res index开始的索引位置
        return res;
    }

    void dfs(vector<int>& nums, int index, vector<int> temp){
    
    
        res.push_back(temp);
        if(nums.size() == index){
    
    
            return ;
        }
        for(int i = index; i < nums.size(); i++){
    
    
            temp.push_back(nums[i]);
            dfs(nums, i + 1, temp);
            temp.pop_back();
        }
    }
};

Je suppose que tu aimes

Origine blog.csdn.net/qq_42771487/article/details/114389974
conseillé
Classement