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不同,有重复的元素,但是解决方法类似。
class Solution {
public:
void backTrack(vector<int>&nums,vector<vector<int>>&res,vector<int>&cur,int index){
res.push_back(cur);
for(int i=index;i<nums.size();i++){
if(i==index||nums[i]!=nums[i-1]){
cur.push_back(nums[i]);
backTrack(nums,res,cur,i+1);
cur.pop_back();
}
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> res;
vector<int> cur;
sort(nums.begin(),nums.end());
backTrack(nums,res,cur,0);
return res;
}
};
为了便于查找不同的地方,我把78题的代码也贴过来
class Solution {
public:
void help(int index, int count,vector<int>nums,vector<int>tem, vector<vector<int>>& result){
result.push_back(tem);
for(int i=index+1;i<count;i++){
tem.push_back(nums[i]);
help(i,count,nums,tem,result);
tem.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> tem;
vector<vector<int>> result;
int count = nums.size();
sort(nums.begin(),nums.end());
help(-1,count,nums,tem,result);
return result;
}
};
区别就是在for循环中,为了避免重复元素导致的重复子序列,所以加了一个判断条件。