遇到回溯题目先画图:
class Solution {
public:
vector<int>path;
vector<vector<int>> result;
int sum=0;
void dfs(int k,int n,int index,int sum)
{
//递归结束条件
if(path.size()==k)
if(sum==n)result.push_back(path);
//单层搜索逻辑
for(int i=index;i<=n;i++)
{
path.push_back(i);
sum+=i;
dfs(k,n,i+1,sum);
sum-=i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
dfs(k,n,1,0);
return result;
}
};
接下来来做一个剪枝操作: 我们观察图可以发现,我们在第一个分支时候就已经找到了答案,后续就不用再遍历了,我们可以把这部分剪去:
//剪枝操作
if(sum>n)return;