LeetCode/solutions/78. Subsets.md
2019-03-22 14:57:49 +08:00

92 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [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;
}
};
```