题目描述:
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],
[]
]
算法实现:
和78.Subsets非常类似,只不过对于重复的元素的处理要繁琐一点,对于重复n次的元素,在子群中可能0,1,2,3...n次;
另外如果没有重复元素原数组没有必要进行排序,对于有重复元素的数组要对重复元素进行单独处理,因此有必要对数组进行排序
class Solution {
public:
vector<vector<int>> res;
vector<int> oneres;
void recursive(vector<int>& nums, int n){
if(n == 0){
res.push_back(oneres);
}
else{
int i = 1;
while(n - 1 - i >= 0 && nums[n - 1 - i] == nums[n - 1])i ++;
recursive(nums, n - i);
for(int k = 1; k <= i; k ++){
for(int j = 0; j < k; j ++)oneres.push_back(nums[n - 1]);
recursive(nums, n - i);
for(int j = 0; j < k; j ++)oneres.pop_back();
}
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
recursive(nums, n);
return res;
}
};