給定一個可能包含重復(fù)元素的整數(shù)數(shù)組 nums恨课,返回該數(shù)組所有可能的子集(冪集)。
說明:解集不能包含重復(fù)的子集。
'''
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為主函數(shù)所求的返回值寺谤、pos標(biāo)記每次的起始位置,tmp為臨時變量值吮播,nums為題目所給數(shù)組变屁。
每次進(jìn)遞歸時先把上一個tmp的變量push到a容器中,當(dāng)循環(huán)到nums的隊(duì)尾后pop出來(也便是回溯的思想)意狠。