问题描述
思路
首先明确这是一个组合问题,组合问题的start会随着递归的推进而改变,根据树状图和容易就明白。这里主要考虑重复的问题,就拿[122]这个例子来说,第2个2,与第一个2在同一层树时需要跳过,因为第一个2已经拿过了,所以不需要在考虑2,但是在同一个树枝上时,就要考虑2,来得到[122]这个结果,所以遇到解决重复的问题,那就需要一个辅助数组isVisited,来判断是否被访问。如果当前元素等于它前面的一个元素,那么如果考虑在同一层,由于回溯,之前那个元素的isVisted=false,这时候我们就不能再取当前元素。在考虑在同一个树枝的情况是,他前面的那一个元素的isVisited=true,于是就可以得到理想的结果。
代码
class Solution {
public:
vector <vector <int>> res;
vector <bool> isVisited;
void getSub(vector <int>&nums,int start,vector <int> &p)
{
if(start==nums.size()) {
res.push_back(p);
return;
}
if(start>0&&nums[start]==nums[start-1]&&isVisited[start-1]==false) {
getSub(nums,start+1,p);
}
else {
p.push_back(nums[start]);
isVisited[start]=true;
getSub(nums,start+1,p);
p.pop_back();
isVisited[start]=false;//回溯
getSub(nums,start+1,p);
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
if(nums.size()==0) return res;
isVisited=vector <bool> (nums.size(),false);
vector <int> p;
sort(nums.begin(),nums.end());
getSub(nums,0,p);
return res;
}
};