这里我们运用回溯实现
每一次都有选与不选。
class Solution {
private:
vector<vector<int>>res;
vector<int>temp;
void dfs(vector<int>& nums,int n,int cur){
if(cur==n){
res.push_back(temp);
return;
}
temp.push_back(nums[cur]);
dfs(nums,n,cur+1);
temp.pop_back();
dfs(nums,n,cur+1);
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n=nums.size();
dfs(nums,n,0);
return res;
}
};
在递归时,若发现没有选择上一个数,且当前数字与上一个数相同,则可以跳过当前生成的子集。
class Solution {
private:
vector<vector<int>>ans;
vector<int>t;
void dfs(bool choose,int cur,vector<int>nums){
if(cur==nums.size()){
ans.push_back(t);
return;
}
dfs(false,cur+1,nums);
if(!choose&&cur>0&&nums[cur-1]==nums[cur]){
return;
}
t.push_back(nums[cur]);
dfs(true,cur+1,nums);
t.pop_back();
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
dfs(true,0,nums);
return ans;
}
};
多了一个choose,判断上一个是否被选中。。上一个相同的没被选中,这一个就可以跳过了,不然就会出现重复。