给定一个整数数组 nums
,其中可能包含重复元素,返回该数组所有可能的子集(幂集)。
该题与上一篇文章求子集最大的区别是 nums 中包含重复元素,所以需要进行去重,与组合问题II中的去重一样,需要进行的是树层去重而不是树枝去重,所以需要增加一个 used 数组记录元素的使用情况,在去重之前要对数组进行排序。
去重操作在组合问题II中,求子集问题在上篇文章中,该题实现代码如下:
//子集II--包括重复元素
vector<int> vec;
vector<vector<int>> result;
void backtracking(vector<int>& nums, int start, vector<bool>& used) {
result.push_back(vec);
//确定终止条件
if(start >= nums.size()) {
return;
}
//单层搜索的逻辑
for(int i = 0; i<nums.size(); i++) {
//判断是否和前面重复
if(i>start && nums[i] == nums[i-1] && used[i-1] == false) {
continue;
}
vec.push_back(nums[i]);
used[i] = true;
backtracking(nums, i+1, used); //递归
vec.pop_back(); //回溯
used[i] = false;
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vec.clear();
result.clear();
sort(nums.begin(), nums.end());
vector<bool> used(nums.size(), false);
backtracking(nums,0,used);
return result;
}