leetcode_78——Subsets(基于DFS的递归,基于同质的递推)
2015-06-04 10:59
627 查看
Subsets
Total Accepted: 49965 Total Submissions: 176963My SubmissionsQuestion Solution
Given a set of distinct integers, nums, 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 nums =
[1,2,3], a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
Hide Tags
Array Backtracking Bit Manipulation
1.基于DFS(深度优先探索)的递归方法。
原数组中每一个元素在子集中有两种状态:要么存在、要么不存在。这样构造子集的过程中每个元素就有两种选择方法:选择、不选择,因此可以构造一颗二叉树来表示所有的选择状态:二叉树中的第i+1层第0层无节点表示子集中加入或不加入第i个元素,左子树表示加入,右子树表示不加入。所有叶节点即为所求子集。因此可以采用DFS的递归思想求得所有叶节点。
上面是看的别人的算法,下面是自己的见解,将这个二叉树的每一层的元素看成是数组里的第i个元素,每一层的元素都相同,当到这一层时你可以选择要或者不要,就可以了
然后采用递归的方法向下,而在这里,需要注意的是,在程序中,,递归的细节处理
#include<iostream> #include<vector> #include<algorithm> using namespace std; void subsets1(vector<int>& S,vector<vector<int> >& temp,vector<int> temp1,int leal,int num) { if(leal==num) { sort(temp1.begin(),temp1.end()); temp.push_back(temp1); return; } leal++; subsets1(S,temp,temp1,leal,num);//这里完事了temp1并没有改变,,,特别注意 temp1.push_back(S[leal-1]);//leal上面加了,这里需要减掉 subsets1(S,temp,temp1,leal,num); return; } vector<vector<int> > subsets(vector<int>& nums) { int num=nums.size(); vector<int> vec; vector<vector<int> >temp; subsets1(nums,temp,vec,0,num); return temp; } int main() { vector<vector<int> > vec1; vector<int> vec; vec.push_back(1);vec.push_back(2);vec.push_back(3); vec1=subsets(vec); for(int i=0;i<vec1.size();i++) { for(int j=0;j<vec1[i].size();j++) cout<<vec1[i][j]<<' '; cout<<endl; } }
2.基于同质的递归
只要我们能找到比原问题规模小却同质的问题,都可以用递归解决。比如要求{1, 2, 3}的所有子集,可以先求{2, 3}的所有子集,{2, 3}的子集同时也是{1, 2, 3} 的子集,然后我们把{2, 3}的所有子集都加上元素1后(注意排序),又得到同样数量的子集, 它们也是{1, 2, 3}的子集。这样一来,我们就可以通过求{2, 3}的所有子集来求 {1, 2, 3}的所有子集了。即为求1,2,3的子集,要先求2,3的子集,然后再把1加入到2,3的子集中去,典型的递归思路。
从第一个开始一点点往后推就可以了
#include<iostream> #include<vector> #include<algorithm> using namespace std; vector<vector<int> > to_next(vector<vector<int> >& temp,vector<int>& vec,int k) { vector<vector<int> > last=temp; for(int i=0;i<temp.size();i++) { temp[i].push_back(vec[k]); sort(temp[i].begin(),temp[i].end()); last.push_back(temp[i]); } return last; } vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>>last; vector<int> tem; last.push_back(tem); int len=nums.size(); for(int i=0;i<len;i++) { last=to_next(last,nums,i); } return last; } int main() { vector<vector<int> > vec1; vector<int> vec; vec.push_back(1);vec.push_back(2);vec.push_back(3); vec1=subsets(vec); for(int i=0;i<vec1.size();i++) { for(int j=0;j<vec1[i].size();j++) cout<<vec1[i][j]<<' '; cout<<endl; } }
相关文章推荐
- 初识C++ 的 this ,引用 的区别
- PHP中4种常用的抓取网络数据方法
- Android的ImageSwitcher和TextSw-android学习之旅(三十四)
- Android的ImageSwitcher和TextSw-android学习之旅(三十四)
- Android的ImageSwitcher和TextSw-android学习之旅(三十四)
- iOS应用崩溃日志分析
- 编译C语言单元测试框架CUnit库的方法
- 差分阻抗
- 科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生
- PHP memcache 原子增减实例
- Microsoft SQL Server 2008完整+差异备份及还原实战
- [转载]SET FOREIGN_KEY_CHECKS=0;在Mysql中取消外键约束
- 006 [翻译] Haneke(一个Swfit iOS缓存类)
- python-数据结构
- 欢迎使用CSDN-markdown编辑器
- Maximum Depth of Binary Tree
- C语言位运算符:与、或、异或、取反、左移和右移
- <数据结构学习与实验指导>3-1一元多项式求导/3-2汉诺塔的非递归实现
- CMake Intro - CMakeLists.txt
- 自定义标签1——条件判断(if-else)