90. Subsets II

这道题写的时候有一些疑惑的地方,这里再记录一下
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> ret;
vector<int> temp;
vector<bool> used(nums.size(), false);
sort(nums.begin(), nums.end());
helper(nums, ret, temp, used, 0);
return ret;
}
private:
void helper(vector<int>& nums, vector<vector<int>>& ret, vector<int>& temp, vector<bool>& used, int idx) {
ret.push_back(temp);
for (int i = idx; i < nums.size(); ++i) {
if (i > idx && nums[i] == nums[i-1] && !used[i-1])
continue;
used[i] = true;
temp.push_back(nums[i]);
helper(nums, ret, temp, used, i+1);
temp.pop_back();
used[i] = false;
}
}
};
//每一层递归代表在temp中的一个位置。比如[1,2,2],1和第一个2可以放在temp的第一个位置上,而第二个2不能够放上去。
//而i > idx而不是i > 0的原因是:要保证对于当前这个情况(前缀和当前位置),不可以有相同数字放在这儿,而不是连续的都不能用。
方法二:
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<int> temp;
vector<vector<int>> res;
vector<bool> used(nums.size(), false);
helper(nums, 0, temp, res, used);
return res;
}
private:
void helper(vector<int>& nums, int idx, vector<int>& temp, vector<vector<int>>& res, vector<bool>& used) {
if (idx == nums.size()) {
res.push_back(temp);
return;
}
helper(nums, idx+1, temp, res, used);
if (!(idx > 0 && nums[idx] == nums[idx-1] && !used[idx-1])) {
used[idx] = true;
temp.push_back(nums[idx]);
helper(nums, idx+1, temp, res, used);
temp.pop_back();
used[idx] = false;
}
}
};
浙公网安备 33010602011771号