求一个序列的所有子集。
大致思路:
也是用dfs来做的,因为其实就是“要”或“不要”的问题,这是dfs可以解决的典型问题!
注意:sort(start,end,排序方法),一般来说end=start+size(),但是vector有.begin和.end()指针就直接用呗。
vector的push_back是添加元素到末尾,那么pop_back则是删除末尾元素!
AC代码:
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > subs;
vector<int> sub;
sort(S.begin(),S.end());
dfs(S,subs,sub,0);
return subs;
}
void dfs(vector<int> S,vector<vector<int> >&subs,vector<int> sub,int start)
{
subs.push_back(sub);
for(int i=start;i<S.size();i++)
{
sub.push_back(S[i]); //要
dfs(S,subs,sub,i+1);
sub.pop_back(); //不要 (注意这个sub是传值,所以pop_back就可以)
}
}
};
同理,“要”或“不要”的组合问题:
给你n,k,输出1~n中k个数的组合。
class Solution {
public:
vector<vector<int> > res;
vector<vector<int> > combine(int n, int k) {
if(n<k)
return res;
if(n==0 || k==0)
return res;
vector<int> cur;
for(int i=1;i<=n;i++)
{
cur.push_back(i);
dfs(n,k,i,1,cur);
cur.pop_back();
}
return res;
}
void dfs(int n,int k,int start,int times,vector<int> cur) //start当前这个数字,times当前这个数字是第几个数
{ //start已经加入了cur
if(times==k)
{
res.push_back(cur);
return;
}
for(int i=start+1;i<=n;i++)
{
//要
cur.push_back(i);
dfs(n,k,i,times+1,cur);
//不要
cur.pop_back();
}
}
};