一.问题描述
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution
is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
二.我的解题思路
拿到这个题目,最直观的思路就是使用回溯法遍历,然后使用map或者set这样的结构来去除重复。先排序,采用回溯法(子集树+map)的结果如下:
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
int len=nums.size();
sort(nums.begin(),nums.end());
vector<int> curr;
set<vector<int>> res;
map<vector<int>,int> flag;
int i=0;
gen_res(nums,curr,res,flag,i);
vector<vector<int>> ans;
set<vector<int>>::iterator it=res.begin();
for(;it!=res.end();it++)
ans.push_back(*it);
return ans;
}
void gen_res(vector<int>& nums, vector<int>& curr,set<vector<int>>& res,map<vector<int>,int>& flag, int i ){
int len=nums.size();
if(i>=len){
res.insert(curr);
// flag[curr]=1;
return;
}
curr.push_back(nums[i]);
gen_res(nums,curr,res,flag,i+1);
curr.pop_back();
gen_res(nums,curr,res,flag,i+1);
}
};