首页 > 代码库 > Subsets系列
Subsets系列
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], []]
方法一:使用深度搜索,对于每个元素都有选择和不选择两种情况,那么我们就一次遍历这个数组,每个元素我们都有两个分支,一是不选择,另一个是选择,代码如下:
1 class Solution { 2 public: 3 vector<vector<int> > subsets(vector<int> &S) { 4 sort(S.begin(), S.end()); //题目要求非递减,所以先排序 5 vector<int> path; //记录对数组元素的选择情况 6 dfs(S, path, 0); 7 return allpath; 8 } 9 10 void dfs(vector<int>& S, vector<int>& path, int k) {11 if( k == S.size() ) { //当k个元素都被选择完毕12 allpath.push_back(path); //那么这就是其中一个子集13 return ;14 }15 dfs(S, path, k+1); //不选择第k个元素16 path.push_back(S[k]); //放入path中17 dfs(S, path, k+1); //选择第k个元素18 path.pop_back(); //取出19 }20 21 private:22 vector< vector<int> > allpath; //存放所有的子集23 };
方法二:分析上面的dfs方法,如下图:
第一层是()
第二层是在第一层的基础上,每个元素都加上1,合起来就是(),(1)
第三层是是在第二层的基础上,每个元素都加上2,合起来就是(),(1),(2),(1,2)
第四层就是在第三层的基础上,每个元素都加上3,合起来就是(),(1),(2),(1,2),(3),(1,3),(2,3),(1,2,3)
因此迭代的方式容易得出了,代码如下:
1 class Solution { 2 public: 3 vector<vector<int> > subsets(vector<int> &S) { 4 vector< vector<int> > ans; 5 sort(S.begin(), S.end()); //答案要求非递减,因此需要排序 6 ans.push_back( vector<int>() ); //首先放入空集,此时ans存放得时第一层的结果 7 for(int i=0; i<S.size(); ++i) { //迭代n个元素 8 int presize = ans.size(); //标记上层的结果的个数 9 for(int j=0; j<presize; ++j) { //上层每个元素取出,并加上S[i],再放入下层的结果中,就得到了下层的结果10 vector<int> tv = ans[j];11 tv.push_back(S[i]);12 ans.push_back(tv);13 }14 }15 return ans;16 }17 };
方法三:使用二进制来模拟子集,数组元素为123,那么010,表示1不选,2选,3不选,依次遍历二进制就可以获取原集合的所有子集,代码如下:
1 class Solution { 2 public: 3 vector<vector<int> > subsets(vector<int> &S) { 4 vector< vector<int> > ans; 5 sort(S.begin(), S.end()); //答案要求非递减,因此需要排序 6 int len = S.size(); 7 unsigned long long maxbits = 1<<len; //设置二进制数上限 8 while( --maxbits ) { //遍历每个二进制值,然后在根据i位的值是1还是0,来选择还是不选择S[i] 9 vector<int> tv;10 for(int i=0; i<len; ++i) //依次扫描n位11 if( 1<<i & maxbits ) {12 tv.push_back(S[i]);13 }14 ans.push_back(tv);15 }16 ans.push_back( vector<int>() ); //maxbits为0跳出循环,没有放入空集,因此需要放入空集17 return ans;18 }19 };
注:代码有bug,如果元素个数超过64个....那么就会出现异常,解决方案是开数组,模拟二进制进位。。。。
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], []]
Subsets系列
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。