题目描述:
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: [1,2,2]
Output:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
对于可能存在重复元素的数组,求所有子集。由于存在重复元素,所以最大的问题在于避免递归产生重复子集。第一步先对数组排序,然后进行递归,对于当前递归元素可以①将该元素加入,得到新的子集;②不加入该元素,维持之前的子集。但是需要注意,如果上一次递归没有加入某个元素,那么在当前递归中遍历到该元素的重复值,那么应该直接跳过,从而避免与上一次递归重复。
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> result;
vector<int> cur;
int i=0;
subsetsWithDup_recur(nums,cur,i,result);
return result;
}
void subsetsWithDup_recur(vector<int> nums, vector<int> cur,int i,vector<vector<int>> &result)
{
if(i==nums.size())
{
result.push_back(cur);
return;
}
#不加入nums[i],则跳过之后所有和nums[i]重复的元素
int temp=i;
while(nums[i]==nums[i+1]&&i<nums.size()-1) i++;
subsetsWithDup_recur(nums,cur,i+1,result);
#加入nums[i]
i=temp;
cur.push_back(nums[i]);
subsetsWithDup_recur(nums,cur,i+1,result);
}
};