递归,树的结构
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
vector<int> out;
DFS(nums,0,out,res);
return res;
}
void DFS(vector<int>& nums,int pos,vector<int>& out,vector<vector<int>>& res){
res.push_back(out);
for(int i=pos;i<nums.size();i++){
out.push_back(nums[i]);
DFS(nums,i+1,out,res);
out.pop_back();
}
}
};
刚开始res只有一个空集,每次循环从nums中取一个数,然后遍历res现存的所有的项,先复制一下,再在复制的后面加上这个数。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res(1);
sort(nums.begin(),nums.end());
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;
}
};
*法三:
把数组中所有的数分配一个状态,true表示这个数在子集中出现,false表示在子集中不出现,那么对于一个长度为n的数组,每个数字都有出现与不出现两种情况,所以共有
中情况,那么我们把每种情况都转换出来就是子集了,我们还是用题目中的例子, [1 2 3]这个数组共有8个子集,每个子集的序号的二进制表示,把是1的位对应原数组中的数字取出来就是一个子集,八种情况都取出来就是所有的子集了,参见代码如下:
1 | 2 | 3 | subset | |
---|---|---|---|---|
0 | F | F | F | [] |
1 | F | F | T | 3 |
2 | F | T | F | 2 |
3 | F | T | T | 23 |
4 | T | F | F | 1 |
5 | T | F | T | 13 |
6 | T | T | F | 12 |
7 | T | T | T | 123 |
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > res;
sort(S.begin(), S.end());
int max = 1 << S.size();
for (int k = 0; k < max; ++k) {
vector<int> out = convertIntToSet(S, k);
res.push_back(out);
}
return res;
}
vector<int> convertIntToSet(vector<int> &S, int k) {
vector<int> sub;
int idx = 0;
for (int i = k; i > 0; i >>= 1) {
if ((i & 1) == 1) {
sub.push_back(S[idx]);
}
++idx;
}
return sub;
}
};```