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();
}
}
};