Coding 问题中有时会出现这样的问题:给定一个集合,求出这个集合所有的子集(所谓子集,就是包含原集合中的一部分元素的集合)。
或者求出满足一定要求的子集,比如子集中元素总和为定值,子集元素个数为定值等等。
我把它们归类为子集系列问题。
思路分析:
思路一
可以用递推的思想,观察S=[], S =[1], S = [1, 2] 时解的变化。
可以发现S=[1, 2] 的解就是 把S = [1]的所有解末尾添上2,然后再并上S = [1]里面的原有解。因此可以定义vector<vector<int> > 作为返回结果res, 开始时res里什么都没有,第一步放入一个空的vecotr<int>,然后这样迭代n次,每次更新res 内容,最后返回res。
1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) 4 { 5 vector<vector<int>> res; 6 vector<int> temp; 7 res.push_back(temp); 8 if(nums.empty()) 9 return res; 10 sort(nums.begin(),nums.end()); 11 for(vector<int>::iterator i=nums.begin();i!=nums.end();i++) 12 { 13 int size=res.size(); 14 for(int j=0;j<size;j++)//这里注意因为res一直在增长,所以遍历res的时候不能用vector<int>::iterator,否则可能因为vector重新allocate内存而地址失效,因此直接使用数组下标。 15 { 16 vector<int> tem; 17 for(auto begin=res[j].begin();begin!=res[j].end();begin++)//仅仅是为了完成在末尾添加新元素(复制+末尾插入) 18 tem.push_back(*begin); 19 tem.push_back(*i); 20 res.push_back(tem); 21 } 22 23 } 24 return res; 25 } 26 };