90. 子集 II

自己做
解:递归选取

cpp
class Solution {
private:
vector<vector<int>> res;
public:
void collect_set(vector<int>& nums, vector<int> combine, int i, bool gain){ //i为当前的下标,gain标记上个元素是否取过
if(i == (int)nums.size()){
res.push_back(combine);
return;
}
//不取
collect_set(nums, combine, i + 1, false);
//取
combine.push_back(nums[i]);
if(i > 0 && nums[i] == nums[i - 1] && gain) //相同元素且上个元素取过
collect_set(nums, combine, i + 1, true);
else if(i == 0 || i > 0 && nums[i] != nums[i - 1]) //不同元素无所谓
collect_set(nums, combine, i + 1, true);
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
collect_set(nums, vector<int>(), 0, true);
return res;
}
};

看题解
把递归的变量掏出来
cpp
class Solution {
private:
vector<vector<int>> res;
vector<int> combine;
public:
void collect_set(vector<int>& nums, int i, bool gain){ //i为当前的下标,gain标记上个元素是否取过
if(i == (int)nums.size()){
res.push_back(combine);
return;
}
//不取
collect_set(nums, i + 1, false);
//取
if(i > 0 && nums[i] == nums[i - 1] && !gain) //相同元素且上个元素没取过,直接返回
return;
combine.push_back(nums[i]);
collect_set(nums, i + 1, true);
combine.pop_back();
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
collect_set(nums, 0, true);
return res;
}
};
