描述
			现在有一个没有重复元素的整数集合S,求S的所有子集
注意:
你给出的子集中的元素必须按升序排列
			
				
			
			
	注意:
你给出的子集中的元素必须按升序排列
				给出的解集中不能出现重复的元素
			
			
				数据范围:1 \le n \le 51≤n≤5,集合中的任意元素满足 |val| \le 10∣val∣≤10 
			
			
				要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!) 
			
		示例1
				输入: 
			[1,2,3]复制
				返回值: 
		[[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]复制
示例2
				输入: 
			[]复制
				返回值: 
		[]复制
		解题思路: 
	
	
		1、本题与全排列类似,全排列要输出的所有元素的所有排列方式,而本题需要输出所有的子集; 
	
	
		2、要输出子集,首先要在递归算法中修改遍历起始位置为当前元素的下一个元素,而不是从0开始遍历; 
	
	
		3、注意题目的输出要求“你给出的子集中的元素必须按升序排列”这个升序并不是字典树的升序,而是个数的升序、个数相同时按字典树的升序; 
	
	
		4、故使用数字k,在递归算法中统计tmp中的数据个数等于k后将tmp加入结果数组。 
	
	class Solution {
public:
    vector<vector<int> >res;
    vector<int> tmp;
    void dfs(vector<int> &S, int k, int index) {
        if (k == tmp.size()) {
            res.push_back(tmp);
        }
        
        int n = S.size();
        for (int i = index; i < n; i++) {
            tmp.push_back(S[i]);
            dfs(S, k, i+1);
            tmp.pop_back();
        }
    }
    vector<vector<int> > subsets(vector<int> &S) {
        
        sort(S.begin(), S.end());
        // 这个for循环是用来控制输出的子集元素的个数,可以理解为分别输出个数为k的子集
        for (int k = 0; k <= S.size(); k++) {
            dfs(S, k, 0);
        }
        return res;
    }
};

京公网安备 11010502036488号