78.子集
感觉不太难,但是就是不会写。感觉回溯里有很多细节问题。
class Solution {
private:
vector<vector<int>> res;
vector<int> num;
void back(vector<int>& nums,int index,int end){
res.push_back(num);
if(index>=end){
return ;
}
for(int i=index;i<end;i++){
num.push_back(nums[i]);
back(nums,i+1,end);
num.pop_back();
}}
public:
vector<vector<int>> subsets(vector<int>& nums) {
res.clear();
num.clear();
back(nums,0,nums.size());
return res;
}
};
90.子集Ⅱ
去重太想不到了,排列问题里去重也是这个套路,所以理解“树层去重”和“树枝去重”非常重要。从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void back(vector<int> nums,int index){
res.push_back(path);
if(index==nums.size())
return;
for(int i=index;i<nums.size();i++){
if(i>index&&nums[i-1]==nums[i])
continue;
path.push_back(nums[i]);
back(nums,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
back(nums,0);
return res;
}
};