Subsets 子集系列问题 leetcode
2016-01-04 00:49
197 查看
子集系列问题:
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。
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。
class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; vector<int> temp; res.push_back(temp); if(nums.empty()) return res; sort(nums.begin(),nums.end()); for(vector<int>::iterator i=nums.begin();i!=nums.end();i++) { int size=res.size(); for(int j=0;j<size;j++)//这里注意因为res一直在增长,所以遍历res的时候不能用vector<int>::iterator,否则可能因为vector重新allocate内存而地址失效,因此直接使用数组下标。 { vector<int> tem; for(auto begin=res[j].begin();begin!=res[j].end();begin++)//仅仅是为了完成在末尾添加新元素(复制+末尾插入) tem.push_back(*begin); tem.push_back(*i); res.push_back(tem); } } return res; } };
相关文章推荐
- 关于fflush(stdin)清空输入缓存流(C/C++)
- 英语听力达人训练营
- Django使用Apache2.2通过Mod_wsgi搭建站点服务器
- 配置虚拟主机
- Redis学习
- Leetcode-10.Regular Expression Matching
- C语言一级指针与二级指针
- Dinner(南阳oj218)(水题,主要是测试数据太弱了)
- C语言通讯录
- 思维 Codeforces491B New York Hotel
- 字符串(1)
- 程序优化
- appium的设计哲学
- Genymotion模拟器无法开启的解决方法——Unable to start the virtual device,The virtual device got no IP address
- 持续集成-Docker 与 DaoCloud 的实践(一)
- 盘点Win10优于Win8的十个地方
- Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)
- Windows 8为何不受欢迎
- Linux免密登陆
- Studio之版本管理工具Git (图文教程)