给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> a;
vector<int> b;
a.push_back(b);
if(nums.empty())
return a;
sort(nums.begin(),nums.end());
int length=nums.size();
for(int i=1;i<=length;i++) //按照长度递增求解
{
findsubsets(a,b,nums,i,0,length);
}
return a;
}
void findsubsets(vector<vector<int>> &a,vector<int> &b,vector<int>& nums,int l,int k,int length)
{
if(k>length)return;
if(l==0)
{
a.push_back(b);
return;
}
for(int i=k;i<length;i++)
{
b.push_back(nums[i]);
findsubsets(a,b,nums,l-1,k+1,length);
b.pop_back();
k++;
}
}
};
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
相比上面的代码只需加上判断子集是否已经含有的代码即可
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> a;
vector<int> b;
a.push_back(b);
if(nums.empty())
return a;
sort(nums.begin(),nums.end());
int length=nums.size();
for(int i=1;i<=length;i++)
{
findsubsets(a,b,nums,i,0,length);
}
return a;
}
void findsubsets(vector<vector<int>> &a,vector<int> &b,vector<int>& nums,int l,int k,int length)
{
if(k>length)return;
if(l==0)
{
int ok=1; // 判断是否已经有该子集
for(auto &c:a)
if(c==b)
{
ok=0;
break;
}
if(ok)
a.push_back(b);
return;
}
for(int i=k;i<length;i++)
{
b.push_back(nums[i]);
findsubsets(a,b,nums,l-1,k+1,length);
b.pop_back();
k++;
}
}
};