mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
92 lines
3.1 KiB
Markdown
92 lines
3.1 KiB
Markdown
# [78. Subsets](https://leetcode.com/problems/subsets/)
|
||
# 思路
|
||
返回给定集合的所有子集。
|
||
## 思路一、DFS
|
||
像这种返回所有可能的组合的题目常规思路都是DFS。
|
||
原集合每一个数字只有两种状态,要么存在,要么不存在,那么在构造子集时就有选择和不选择两种情况,所以可以构造一棵二叉树,左子树表示选择该层处理的节点,右子树表示不选择,最终的叶节点就是所有子集合,树的结构如下:
|
||
```
|
||
[]
|
||
/ \
|
||
/ \
|
||
/ \
|
||
[1] []
|
||
/ \ / \
|
||
/ \ / \
|
||
[1 2] [1] [2] []
|
||
/ \ / \ / \ / \
|
||
[1 2 3] [1 2] [1 3] [1] [2 3] [2] [3] []
|
||
```
|
||
## 思路二
|
||
其实这题可以不用递归来做,对于题目中给的例子[1,2,3]来说,最开始是空集,那么我们现在要处理1,就在空集上加1,为[1],
|
||
现在我们有两个自己[]和[1],下面我们来处理2,我们在之前的子集基础上,每个都加个2,可以分别得到[2],[1, 2],
|
||
那么现在所有的子集合为[], [1], [2], [1, 2],同理处理3的情况可得[3], [1, 3], [2, 3], [1, 2, 3], 再加上之前的子集就是所有的子集合了。
|
||
|
||
# C++
|
||
## 思路一
|
||
### 好理解版
|
||
``` C++
|
||
class Solution {
|
||
private:
|
||
void DFS(vector<vector<int>>&res, vector<int>&subset, const vector<int>& nums, int level){
|
||
if(level == nums.size()) { // 到达叶节点
|
||
res.push_back(subset);
|
||
return;
|
||
}
|
||
// 向左子树下降
|
||
subset.push_back(nums[level]);
|
||
DFS(res, subset, nums, level + 1);
|
||
subset.pop_back();
|
||
// 向右子树下降
|
||
DFS(res, subset, nums, level + 1);
|
||
}
|
||
public:
|
||
vector<vector<int>> subsets(vector<int>& nums) {
|
||
vector<vector<int>>res;
|
||
vector<int>subset;
|
||
sort(nums.begin(), nums.end());
|
||
DFS(res, subset, nums, 0);
|
||
return res;
|
||
}
|
||
};
|
||
```
|
||
### 简洁版
|
||
``` C++
|
||
class Solution {
|
||
private:
|
||
void DFS(vector<vector<int>>&res, vector<int>&subset, const vector<int> &nums, const int level){
|
||
res.push_back(subset);
|
||
if(level == nums.size()) return;
|
||
for(int i = level; i < nums.size(); i++){
|
||
subset.push_back(nums[i]);
|
||
DFS(res, subset, nums, i+1);
|
||
subset.pop_back();
|
||
}
|
||
}
|
||
public:
|
||
vector<vector<int>> subsets(vector<int>& nums) {
|
||
vector<vector<int>>res;
|
||
vector<int>subset;
|
||
DFS(res, subset, nums, 0);
|
||
return res;
|
||
}
|
||
};
|
||
```
|
||
## 思路二
|
||
``` C++
|
||
class Solution {
|
||
public:
|
||
vector<vector<int>> subsets(vector<int>& nums) {
|
||
vector<vector<int>>res;
|
||
res.push_back(vector<int>{});
|
||
for(int i = 0; i < nums.size(); i++){
|
||
int size = res.size();
|
||
for(int j = 0; j < size; j++){
|
||
res.push_back(res[j]);
|
||
res.back().push_back(nums[i]);
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
};
|
||
```
|