子集 回溯算法

在这里插入图片描述
采用回溯算法,每个数有两种情况,选中或不选中

class Solution{
public:
	//结果集
	vector<vector<int>> ans;
	//临时数组
	vector<int> path;
	vector<vector<int>> subsets(vector<int> &nums){
		dfs(nums,0);
		return ans;
	}
	void dfs(vector<int> &nums,int len){
		if(len==nums.size()){
			ans.push_back(path);
			return;
		}
		//将当前数添加到path中 代表选中该数
		path.push_back(nums[len]);
		dfs(nums,len+1);
		//将该数去掉 代表不选中该数
		path.pop_back();
		dfs(nums,len+1);
	}
};

可能包含重复元素
在这里插入图片描述

class Solution {
public:
   vector<vector<int>> ans;
    vector<int> t;
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
    	//对数组进行排序
        sort(nums.begin(),nums.end());
        dfs(nums,0);
        return ans;
    }
    void dfs(vector<int> &nums,int len){
        if(len==nums.size()){
            ans.push_back(t);
            return ;
        }
        t.push_back(nums[len]);
        dfs(nums,len+1);
        t.pop_back();
        int count=0;
        //找到第一个不相等的数 
        for(int i=len;i<nums.size()&&nums[i]==nums[len];i++,count++);
        dfs(nums,len+count);
    }

};
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页