棋子

导航

Subsets 子集系列问题 leetcode

子集系列问题

Coding 问题中有时会出现这样的问题:给定一个集合,求出这个集合所有的子集(所谓子集,就是包含原集合中的一部分元素的集合)。

或者求出满足一定要求的子集,比如子集中元素总和为定值,子集元素个数为定值等等。

我把它们归类为子集系列问题。

 

leetcode上原题链接

思路分析:

思路一

可以用递推的思想,观察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 };

 

posted on 2016-01-04 00:49  鼬与轮回  阅读(727)  评论(0编辑  收藏  举报