Subsets
Given a set of distinct integers, nums, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3], a solution is:[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解析
思路一:
求幂集问题
刚开始没有一点思路,但是我刚刚做了Combinations,可以说Combinations是本题的一个子过程。原因是,组合个数从0到n遍历一遍,就是本题的结果了。
思路一代码
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
this->n=nums.size();
//k:0~n
for(int i=0;i<=nums.size();i++){
this->k=i;
com(0,0,nums);
}
return vvi;
}
private:
void com(int j,int t,vector<int>& nums){
if(j==k){
vvi.push_back(vi);
}
else{
for(int i=t;i<n;i++){
vi.push_back(nums[i]);
com(j+1,i+1,nums);
vi.pop_back();
}
}
}
private:
vector<vector<int>> vvi;
vector<int> vi;
int k;
int n;
};
代码二
对思路一进行一些改进。基本思想不变
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
com(0,nums);
return vvi;
}
private:
void com(int pos,vector<int>& nums){
vvi.push_back(vi);
if(pos>=nums.size()) return ;
for(int i=pos;i<nums.size();i++){
vi.push_back(nums[i]);
com(i+1,nums);
vi.pop_back();
}
}
private:
vector<vector<int>> vvi;
vector<int> vi;
};