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

Subsets

  Total Accepted: 49965 Total Submissions: 176963My Submissions

 

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;

	}

}

  

你可能感兴趣的:(LeetCode)