题目描述
Subsets
Given a set of distinct integers, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,3]
, a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
Subsets II
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2]
, a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
题目分析
总结
代码示例
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > ret;
vector<int> tmp;
sort(S.begin(),S.end());
subsetsCore(ret,0,S,tmp);
return ret;
}
void subsetsCore(vector<vector<int> > &ret,int index,vector<int> &S,vector<int> &tmp)
{
if(index == S.size())
{
ret.push_back(tmp);
return;
}
for(int i = index;i<S.size();i++)
{
tmp.push_back(S[i]);
subsetsCore(ret,i+1,S,tmp);
tmp.pop_back();
}
ret.push_back(tmp);
}
};
class Solution {
public:
vector<vector<int> > subsetsWithDup(vector<int> &S) {
vector<vector<int> > ret;
vector<int> tmp;
sort(S.begin(),S.end());
subsetsWithDupCore(ret,0,S,tmp);
return ret;
}
void subsetsWithDupCore(vector<vector<int> > &ret,int index,vector<int> &S,vector<int> &tmp)
{
if(index == S.size())
{
if(find(ret.begin(),ret.end(),tmp) == ret.end())
ret.push_back(tmp);
return;
}
subsetsWithDupCore(ret,index+1,S,tmp);
tmp.push_back(S[index]);
subsetsWithDupCore(ret,index+1,S,tmp);
tmp.pop_back();
}
};
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > ret;
vector<int> tmp;
sort(S.begin(),S.end());
subsetsCore(ret,0,S,tmp);
return ret;
}
void subsetsCore(vector<vector<int> > &ret,int index,vector<int> &S,vector<int> &tmp)
{
if(index == S.size())
{
ret.push_back(tmp);
return;
}
for(int i = index;i<S.size();i++)
{
tmp.push_back(S[i]);
subsetsCore(ret,i+1,S,tmp);
tmp.pop_back();
}
ret.push_back(tmp);
}
};
class Solution {
public:
vector<vector<int> > subsetsWithDup(vector<int> &S) {
vector<vector<int> > ret;
vector<int> tmp;
sort(S.begin(),S.end());
subsetsWithDupCore(ret,0,S,tmp);
return ret;
}
void subsetsWithDupCore(vector<vector<int> > &ret,int index,vector<int> &S,vector<int> &tmp)
{
if(index == S.size())
{
if(find(ret.begin(),ret.end(),tmp) == ret.end())
ret.push_back(tmp);
return;
}
subsetsWithDupCore(ret,index+1,S,tmp);
tmp.push_back(S[index]);
subsetsWithDupCore(ret,index+1,S,tmp);
tmp.pop_back();
}
};
推荐学习C++的资料
C++标准函数库
在线C++API查询