给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
'''
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> a;
vector<int> tmp;
sort(nums.begin(),nums.end());
push_it(a,0,tmp,nums);
tmp.clear();
set<vector<int>> b;
for(int i=0;i<a.size();i++){
b.insert(a[i]);
}
a.clear();
for(set<vector<int>>::iterator it=b.begin();it!=b.end();it++){
a.push_back(*it);
}
return a;
}
private:
void push_it(vector<vector<int>> &a,int pos, vector<int> tmp,vector<int>& nums){
a.push_back(tmp);
for(int i=pos;i<nums.size();i++){
tmp.push_back(nums[i]);
push_it(a,i+1,tmp,nums);
tmp.pop_back();
}
return ;
}
};
'''
其中回溯代码部分解释:
'''
void push_it(vector<vector<int>> &a,int pos, vector<int> tmp,vector<int>& nums){
a.push_back(tmp);
for(int i=pos;i<nums.size();i++){
tmp.push_back(nums[i]);
push_it(a,i+1,tmp,nums);
tmp.pop_back();
}
return ;
}
'''
该部分最好背下来,四个变量:a为主函数所求的返回值、pos标记每次的起始位置,tmp为临时变量值,nums为题目所给数组。
每次进递归时先把上一个tmp的变量push到a容器中,当循环到nums的队尾后pop出来(也便是回溯的思想)。