您的位置:首页 > 其它

leetcode_78——Subsets(基于DFS的递归,基于同质的递推)

2015-06-04 10:59 627 查看

Subsets

Total Accepted: 49965 Total Submissions: 176963My Submissions
Question 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;
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: