本题思考:
对于输入样例k=3,n=9
输出里面为什么只有
[[1,2,6],[1,3,5],[2,3,4]]
而没有下图所示的重复情况出现呢?
当时代码写错了,思考许久不得解,后面经过仔细对比代码之后发现是我的代码出现了逻辑错误,而正是这一关键的一个变量名写错导致了我一道递归写一天,太FFFFKKKKK了!!!
关键性代码逻辑
下面是错误的
for(int i=idx;i<=9;++i){
// if(!visited[i]){
visited[i]=1;
sum+=i;
v.push_back(i);
dfs(k,n,idx+1,sum);
sum-=i;
v.pop_back();
visited[i]=0;
// }
}
这个是正确的
for(int i=idx;i<=9;++i){
// if(!visited[i]){
visited[i]=1;
sum+=i;
v.push_back(i);
dfs(k,n,i+1,sum);//关键是这里i写成了idx,导致了关键逻辑错误!!!
sum-=i;
v.pop_back();
visited[i]=0;
// }
}
分析只有1->2->6而没有1->6->2的原因:
递归入口写dfs(k,n,i+1,sum);
不写dfs(k,n,idx+1,sum);
保证了每次i
都是越来越大的,遍历完1->2->6
之后遍历到1->6
的时候,接下来函数入口是1->6->7
,1->6->8
,不再会从1开始,所以1->6->2
这种又从起始点开始的就会有重复现象产生!!!!!!a1->a2->a3
这里面是a1<a2<a3
的!!!,因为这是递增的!!!,每次都是从i+1的dfs函数入口递增!!!!!!
正解代码如下!,这里的visit数组是没用的!
class Solution {
public:
vector<int> v;
vector<vector<int>> vv;
vector<int> visited={
0,0,0,0,0,
0,0,0,0,0,0
};
vector<vector<int>> combinationSum3(int k, int n) {
vv.clear();
v.clear();
dfs(k,n,1,0);
return vv;
}
void dfs(int k,int n,int idx ,int sum){
if(sum>n){
return;
}
if(v.size()>=k){
if(sum==n)
vv.push_back(v);
return;
}
for(int i=idx;i<=9;++i){
// if(!visited[i]){
visited[i]=1;
sum+=i;
v.push_back(i);
dfs(k,n,i+1,sum);
sum-=i;
v.pop_back();
visited[i]=0;
// }
}
}
};