您的位置:首页 > 其它

Subsets and Subsets II (回溯,DFS,组合问题)

2014-11-24 10:15 337 查看
Givenasetofdistinctintegers,S,returnallpossiblesubsets.

Note:

Elementsinasubsetmustbeinnon-descendingorder.

Thesolutionsetmustnotcontainduplicatesubsets.

Forexample,
IfS=
[1,2,3]
,asolutionis:

[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

该题和Combinations很类似,只不过是k需要从0到size中取值。


classSolution{
private:
vector<vector<int>>res;
vector<int>s;
public:
voidtra(intk,intstart,intdep,vector<int>temp)
{
if(dep==k){
res.push_back(temp);
return;
}
for(inti=start;i<s.size();++i){
temp.push_back(s[i]);
tra(k,i+1,dep+1,temp);//是i+1,而不是start+1
temp.erase(temp.end()-1);
}
}
vector<vector<int>>subsets(vector<int>&S){
s=S;
sort(s.begin(),s.end());
vector<int>temp;
for(intk=0;k<=s.size();++k){
tra(k,0,0,temp);
}
returnres;
}
};


我的分析图:






Subsets2

Givenacollectionofintegersthatmightcontainduplicates,S,returnallpossiblesubsets.


Note:



Elementsinasubsetmustbeinnon-descendingorder.

Thesolutionsetmustnotcontainduplicatesubsets.

Forexample,
IfS=
[1,2,2]
,asolutionis:


[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]



classSolution{
private:
vector<vector<int>>res;
vector<int>s;
public:
voidtra(intk,intstart,intdep,vector<int>temp)
{
if(dep==k){
for(inti=0;i<res.size();++i)
{
if(res[i]==temp)return;
}
res.push_back(temp);
return;
}
for(inti=start;i<s.size();++i){
temp.push_back(s[i]);
tra(k,i+1,dep+1,temp);
temp.erase(temp.end()-1);
}
}
vector<vector<int>>subsetsWithDup(vector<int>&S){
s=S;
sort(s.begin(),s.end());
vector<int>temp;
res.push_back(temp);
for(intk=1;k<=s.size();++k){
tra(k,0,0,temp);
}
returnres;
}
};





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: