1.Subsets
代码1:
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int>>v;
vector<int>v2(S.size(),0);
sort(S.begin(),S.end());
subset(v,S,0,v2);
return v;
}
void subset(vector<vector<int>> &v,vector<int> &S,int cur,vector<int> &v2)
{
if(cur==S.size())
{
vector<int>child;
for(int i=0;i<cur;i++)
{
if(v2[i])
child.push_back(S[i]);
}//另外一道题SubSetII,此处加上if(count(v.begin(),v.end(),child)==0)
v.push_back(child);
return;
}
v2[cur]=1;
subset(v,S,cur+1,v2);
v2[cur]=0;
subset(v,S,cur+1,v2);
}
};
较好的解法:
class Solution {
public:
vector<vector<int>>v;
vector<int>temp;
vector<vector<int> > subsetsWithDup(vector<int> &S)
{
sort(S.begin(),S.end());
v.clear();
temp.clear();
dfs(S,0);
return v;
}
void dfs(vector<int> &S,int dep)
{
v.push_back(temp);
for(int i=dep;i<S.size();i++)
{
if(i!=dep&&S[i]==S[i-1])continue; //SubsetsII 添加代码
temp.push_back(S[i]);
dfs(S,i+1);
temp.pop_back();
}
}
};