题目
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
思路
1.类似leetcode78. 子集,但要去重
2.先排序
3.当连续重复数字时, 允许1 1 1 0 0,不允许 1 0 1 0 1或者1 0 0 1 1,即前一个重复数字未选取时,当前数字选取会造成重复
实现
// 去重:当连续重复数字时, 允许1 1 1 0 0,不允许 1 0 1 0 1或者1 0 0 1 1,即前一个重复数字未选取时,当前数字选取会造成重复
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<int> tmp;
if (nums.empty()) {
res.push_back(tmp);
return res;
}
sort(nums.begin(), nums.end());
func(nums, 0, tmp, false);
return res;
}
// flag表示前一个数字是否被选取
void func(vector<int>& nums, int start, vector<int>& tmp, bool flag) {
if (start == nums.size()) {
res.push_back(tmp);
} else {
if (start > 0 && nums[start] == nums[start - 1] && flag == false) {
func(nums, start + 1, tmp, false);
} else {
tmp.push_back(nums[start]);
++start;
func(nums, start, tmp, true);
tmp.pop_back();
func(nums, start, tmp, false);
}
}
}
};