78. Subsets
Given a set of distinct integers, nums, return all possible subsets.
Note: 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], [] ]
class Solution {
public:
/*
//时间复杂度 O(2^N) 空间复杂度O(n)
void subset(vector<vector<int>>& result,vector<int>&path,int step,vector<int>&nums)
{
if(nums.size() == step)
{
result.push_back(path);
return;
}
subset(result,path,step+1,nums);
path.push_back(nums[step]);
subset(result,path,step+1,nums);
path.pop_back();
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size() == 0)
{
return result;
}
vector<int> path;
subset(result,path,0,nums);
return result;
}
*/
void subset(vector<vector<int>>& result,vector<bool>&selected,int step,vector<int>&nums)
{
//结束条件
if(nums.size() == step)
{
vector<int> PathSubset;
for(int i = 0; i < nums.size();i++)
{
if(selected[i] == true)
{
PathSubset.push_back(nums[i]);
}
}
result.push_back(PathSubset);
return;
}
//不选step
selected[step] = false;
subset(result,selected,step+1,nums);
//选择step
selected[step] = true;
subset(result,selected,step+1,nums);
}
//位向量法 开一个bool selected[n] 每个元素可以选或者不选
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> result;
if(nums.size() == 0)
{
return result;
}
vector<bool> selected(nums.size(),false);
subset(result,selected,0,nums);
return result;
}
};
public:
/*
//时间复杂度 O(2^N) 空间复杂度O(n)
void subset(vector<vector<int>>& result,vector<int>&path,int step,vector<int>&nums)
{
if(nums.size() == step)
{
result.push_back(path);
return;
}
subset(result,path,step+1,nums);
path.push_back(nums[step]);
subset(result,path,step+1,nums);
path.pop_back();
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size() == 0)
{
return result;
}
vector<int> path;
subset(result,path,0,nums);
return result;
}
*/
void subset(vector<vector<int>>& result,vector<bool>&selected,int step,vector<int>&nums)
{
//结束条件
if(nums.size() == step)
{
vector<int> PathSubset;
for(int i = 0; i < nums.size();i++)
{
if(selected[i] == true)
{
PathSubset.push_back(nums[i]);
}
}
result.push_back(PathSubset);
return;
}
//不选step
selected[step] = false;
subset(result,selected,step+1,nums);
//选择step
selected[step] = true;
subset(result,selected,step+1,nums);
}
//位向量法 开一个bool selected[n] 每个元素可以选或者不选
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> result;
if(nums.size() == 0)
{
return result;
}
vector<bool> selected(nums.size(),false);
subset(result,selected,0,nums);
return result;
}
};

浙公网安备 33010602011771号