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], [] ]
递归:
增量构造法:
class Solution {
public:
void dfs(vector<int> &S,int start,vector<int> &path,vector<vector<int>> &result){
result.push_back(path);
for(int i=start;i<S.size();i++){
if(i!=start&&S[i]==S[i-1])continue;
path.push_back(S[i]);
dfs(S,i+1,path,result);
path.pop_back();
}
}
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int>> result;
vector<int> path;
sort(S.begin(),S.end());
dfs(S,0,path,result);
return result;
}
};
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int>> result;
vector<int> path;
sort(S.begin(),S.end());
subsets(S,path,0,result);
return result;
}
private:
static void subsets(vector<int> &S,vector<int> &path,int step,vector<vector<int>> &result){
if(step==S.size()){
result.push_back(path);
return;
}
//不选
subsets(S,path,step+1,result);
//选
path.push_back(S[step]);
subsets(S,path,step+1,result);
path.pop_back();
}
};
位向量法:
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int>> result;
vector<bool> selected(S.size(),false);
sort(S.begin(),S.end());
subsets(S,selected,0,result);
return result;
}
private:
static void subsets(vector<int> &S,vector<bool> &selected,int step,vector<vector<int>> &result){
if(step==S.size()){
vector<int> subset;
for(int i=0;i<S.size();i++)
if(selected[i])subset.push_back(S[i]);
result.push_back(subset);
return;
}
//不选
selected[step]=false;
subsets(S,selected,step+1,result);
//选
selected[step]=true;
subsets(S,selected,step+1,result);
}
};
迭代
增量构造法
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int>> result(1);
sort(S.begin(),S.end());
for(auto elem : S){
result.reserve(result.size()*2);
auto half = result.begin()+result.size();
copy(result.begin(),half,back_inserter(result));
for_each(half,result.end(),[&elem](decltype(result[0]) &e){
e.push_back(elem);
});
}
return result;
}
};
二进制法:
此方法最为巧妙
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int>> result;
sort(S.begin(),S.end());
const size_t n=S.size();
vector<int> v;
for(size_t i=0;i<1<<n;i++){
for(size_t j=0;j<n;j++){
if(i&1<<j)v.push_back(S[j]);
}
result.push_back(v);
v.clear();
}
return result;
}
};