LeetCode 刷题【90. 子集 II】
90. 子集 II
自己做
解:递归选取
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;}
};
看题解
把递归的变量掏出来
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;}
};