题解:
回溯三部曲:
1、确定回溯函数参数
回溯法中的递归函数参数很难一次性确定下来,一般先写逻辑,需要什么参数填什么参数
2、确定回溯终止条件
当path.size()==k,终止,比较path中的和是否为目标和
3、确定单层搜索过程
path收集每次选取的元素,相当于树型结构里面的边,sum来统计path元素的总和,注意处理过程和回溯过程一一对应,处理有加,回溯就要有减
class Solution {
public:
//结果集
vector<vector<int>> result;
//符合要求的一个组合
vector<int> path;
//回溯函数 为避免每次终止时计算总和,参加一个参数sum为path总和
//同上一个组合问题 需要一个startIndex作为遍历的起始点(取过一次值的不再取)
void backtracking(int k,int n,int sum,int startIndex){
if(path.size() == k){
//判断总和是否等于目标和
if(sum == n){
result.push_back(path);
}
return ;
}
//单层搜索过程
//for循环横向遍历 递归纵向遍历 同样优化最大起始点
for(int i = startIndex;i<=9-(k-path.size())+1;i++){
//处理
path.push_back(i);
sum += i;
//回溯
backtracking(k,n,sum,i+1);
sum -= i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k,n,0,1);
return result;
}
};
剪枝:总和大于目标和时,没有必要继续搜索
if(sum >n ){
return;
}