返回集合的所有子集
leetcode上的一道题,求[1,2,3]的所有子集,相当于求1和[2,3]所有子集的集合,因此先求[2,3]的子集,进而先
求[3]的子集,因此可以用递归来做。在这个过程中,需要保存路径。
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
vvi get_subsets1(int a[],int idx,int n)
{
vvi subsets;
if(idx==n)
{ //返回空集
vi subset;
subsets.push_back(subset);
}
else
{
vvi rsubsets=get_subsets1(a,idx+1,n);//返回某个集合
//将该元素与返回集合的各元素合并,得到各个集合
int v=a[idx];
for(int i=0;i<rsubsets.size();i++)
{
vi subset=rsubsets[i];
subsets.push_back(subset);
subset.push_back(v);
subsets.push_back(subset);
}
}
return subsets;
}
void print_subsets(vvi sub)
{
for(int i=0;i<sub.size();i++)
{
vi subset=sub[i];
for(int j=0;j<subset.size();j++)
{
cout<<subset[j]<<"";
}
cout<<endl;
}
}
int main(){
int a[] = {
1, 2, 3, 4
};
vvi sub1 = get_subsets1(a, 0, 4);
print_subsets(sub1);
system("pause");
return 0;
}