错误代码:ans没有去重
结果中会出现,2,5和5,2这种情况
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int>tep;
dfs(ans,candidates,target,0,0,tep);
return ans;
}
void dfs(vector<vector<int>>& ans,vector<int>& candidates,int target,int sum,int index,vector<int> tep){
if(sum==target){
ans.push_back(tep);
return;
}
if(sum>target) return;
for(int i=index;i<candidates.size();i++){
tep.push_back(candidates[i]);
dfs(ans,candidates,target,sum+candidates[i],i+1,tep);
tep.pop_back();
}
}
先sort一下,保证结果中的数字都是有序的,再用set判重。但用时较多。
set<vector<int> > flag;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int>tep;
sort(candidates.begin(),candidates.end());
dfs(ans,candidates,target,0,0,tep);
return ans;
}
void dfs(vector<vector<int>>& ans,vector<int>& candidates,int target,int sum,int index,vector<int> tep){
if(sum==target){
if(flag.count(tep)==0){
ans.push_back(tep);
flag.insert(tep);
}
return;
}
if(sum>target) return;
for(int i=index;i<candidates.size();i++){
tep.push_back(candidates[i]);
dfs(ans,candidates,target,sum+candidates[i],i+1,tep);
tep.pop_back();
}
}
sort一下之后,数组有序。
- 但会出现这种情况。就是num[i]=num[i-1]的时候。
- 我们的index是循环的初始,保证了每次选元素都是它的下一次元素。
- 在一个for循环里面,元素都是一层的。比如图中的1,1,2,5,6,他们就是一层的。他们的index是一样的。
- 如果我们剪枝使用
i>0&&num[i]==num[i-1]
,那么相同元素在不同的层上也会被剪掉。如
【1,2,2】 target=5
- 避免这种情况,我们
i>index&&num[i]==num[i-1]
。一方面可以判断i>0,另一方面可以剪枝,
i>index
说明是在同一层上选元素(如在,1,1,2,5,6上选一个元素进行深入),那么在同一层上元素相同,我们就进行剪枝。