本题思考:
对于输入样例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;// }}}
};