Given a list of numbers that may has duplicate numbers, return all possible subsets
1.
先排序;
再按求Subsets一样的做法,只是添加前检查是否已经存在。
耗时171ms
class Solution {
public:
/**
* @param S: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
vector<vector<int> >res;
void dfs(const vector<int> &S,vector<bool> choosed,int cur){
if(cur==S.size()){
vector<int> sub;
for(int i=0;i<choosed.size();i++){
if(choosed[i]){
sub.push_back(S[i]);
}
}
vector<vector<int> >::iterator it=find(res.begin(),res.end(),sub);
if(it==res.end()){
res.push_back(sub);
}
return;
}
choosed[cur]=true;
dfs(S,choosed,cur+1);
choosed[cur]=false;
dfs(S,choosed,cur+1);
}
vector<vector<int> > subsetsWithDup(const vector<int> &S) {
// write your code here
int len=S.size();
vector<int> S2(S);
sort(S2.begin(),S2.end());
vector<bool> choosed(len,false);
dfs(S2,choosed,0);
return res;
}
};
2.