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],
[]
]
Solution
先加入空集,然后按照子集的大小,用递归回溯,获取全部子集。基础的递归题。
Code
#include <iostream>
#include <vector>
using namespace std;
//当前填充的是第 Index 位,候选数字从 start 开始
void f(int Index, int start, int n, int k, vector<vector<int> > &res, vector<int> &temp, vector<int> &number)
{
if(Index == k+1)
{
res.push_back(temp);
temp.pop_back();
return;
}
for(int i=start;i<=n;i++)
{
if(n-start+1 < k-Index+1)
break;
vector<int> tt = temp;
temp.push_back(number[i-1]);
f(Index+1, i+1, n, k, res, temp, number);
temp = tt;
}
}
vector<vector<int>> subsets(vector<int>& nums)
{
int len = nums.size();
vector<vector<int> > res;
vector<int> Empty; //空集也是子集
res.push_back(Empty);
for(int i=1;i<=len;i++) //枚举子集的长度
{
vector<vector<int> > tmp_res;
vector<int> temp;
f(1, 1, nums.size(), i, tmp_res, temp, nums);
for(int j=0;j<tmp_res.size();j++)
res.push_back(tmp_res[j]);
}
return res;
}
int main()
{
int t, k;
while(cin>>k)
{
vector<int> Input;
while(k--)
{
cin>>t;
Input.push_back(t);
}
vector<vector<int> > res = subsets(Input);
for(int i=0;i<res.size();i++)
{
for(int j=0;j<res[i].size();j++)
{
cout<<res[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
}