Leetcode | 78. Subsets

78. Subsets(求集合的子集问题)

分析:求集合的所有子集问题。题目要求子集中元素非递减序排列,因此我们先要对原来的集合进行排序。原集合中每一个元素在子集中有两种状态:要么存在、要么不存在。这样构造子集的过程中每个元素就有两种选择方法:选择、不选择,因此可以构造一颗二叉树,例如对于例子中给的集合[1,2,3],构造的二叉树如下(左子树表示选择该层处理的元素,右子树不选择),最后得到的叶子节点就是子集:

class Solution 
{
private:
	vector<vector<int> rets;
public:
    vector<vector<int>> subsets(vector<int>& nums)
    {
    	sort(nums.begin(), nums.end());
    	vector<int> yhs;
    	DFS(0, nums, yhs);
    	return rets;    
    }

    void DFS(int end, vector<int> &nums, vector<int> &yhs)
    {
    	if(end == nums.size())
    	{
    		ret.push_back(yhs);
    		return;
    	}
    	yhs.push_back(nums[end]);
    	DFS(end + 1, nums, yhs);
    	yhs.pop_back();
    	DFS(end + 1, nums, yhs);
    }
};

  

猜你喜欢

转载自www.cnblogs.com/sunbines/p/9285745.html