Subsets I
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 =
If S =
[1,2,3]
, a solution is:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
class Solution { public: vector<vector<int> > subsets(vector<int> &S) { // Start typing your C/C++ solution below // DO NOT write int main() function sort(S.begin(), S.end()); vector<int> init_mask(S.size(), 0); vector<vector<int> > r; r.push_back(vector<int>()); for(int ii = 0; ii < S.size(); ++ii){ init_mask[ii] = 1; vector<int> mask(init_mask); do{ vector<int> subset; for(int jj = 0; jj < S.size(); ++jj){ if (mask[jj]) subset.push_back(S[jj]); } r.push_back(subset); }while(prev_permutation(mask.begin(),mask.end())); } return r; } };
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 =
If S =
[1,2,2]
, a solution is:[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
class Solution { vector<vector<int> > result; map<int,int> us;//unique_s: [val], count void build(vector<int> line, map<int,int>::iterator it, int depth){ if (it == us.end() || depth < 0) return; for(; it != us.end(); ++it){ for(int ii = 1; ii <= it->second; ++ii){ vector<int> temp(line); temp.insert(temp.end(), ii, it->first); if (depth - ii == 0){ result.push_back(temp); }else{ ++it; build(temp, it, depth - ii); --it; } } } return; } public: vector<vector<int> > subsetsWithDup(vector<int> &S) { // Start typing your C/C++ solution below // DO NOT write int main() function result.clear(); result.push_back(vector<int>()); if (S.empty()) return result; us.clear(); for(int ii = 0; ii < S.size(); ++ii){ ++us[S[ii]]; } map<int,int>::iterator it = us.begin(); for(int ii = 0; ii <= S.size(); ++ii) build(vector<int>(), it, ii); return result; } };
No comments:
Post a Comment