题目描述
可以套回溯模版的题,但是在写的过程中发现,如果数组中有多个相同元素分散存在的话,就会有一些子集无法得到
像这里的1,4,4,如果对数组从左到右枚举的话是无论如何都得不到的。
对这样的数组使用排序函数后,造成的效果就是相同的元素都堆在了一起,这样就能正确地得到所有子集。
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
bool occured(vector<int>& nums, int key, int startindex){
for(int i = startindex; i < key; i++){
if(nums[key] == nums[i]){
return true;
}
}
return false;
}
void backtrace(vector<int>& nums, int startindex,int length){
if(path.size() == length){
res.push_back(path);
}
if(length > nums.size()){
return ;
}
for(int i = startindex; i < nums.size(); i++){
if(i != startindex && occured(nums, i,startindex)){
continue;
}else{
path.push_back(nums[i]);
backtrace(nums, i + 1, length + 1);
path.pop_back();
}
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
res.clear();
sort(nums.begin(), nums.end());
backtrace(nums, 0, 0);
return res;
}
};
标签:力扣,nums,int,res,II,startindex,vector,回溯,path
From: https://www.cnblogs.com/satsuki26681534/p/18062740