题目来源:https://leetcode.cn/problems/combination-sum-iii/description/
C++题解:由 进入for循环进行回溯,到 ......,以此类推。
递归法:
- 确定递归函数参数:要求集合的个数k,目标和n,下一层for循环搜索的起始位置startInd,已有的元素总和sum;
- 确定终止条件:当已搜索到k个元素时,条件终止。如果k个元素和sum等于目标和n,保存数组;
- 单层递归逻辑:当sum加上新元素i大于目标和时,跳出循环(剪枝);保存当前数据,并进行下一步递归,递归结束时进行回溯,保存的数据弹出path。
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void backtracking(int k, int n, int startInd, int sum) {
if(path.size() == k) {
if(sum == n) res.push_back(path); //满足条件保存结果
return ;
}
for(int i = startInd; i <= 9 - (k - path.size()) + 1; i++) { //剪枝
if(sum + i > n) break; //剪枝
path.push_back(i);
backtracking(k, n, i+1, sum+i); //i和sum这里其实也是回溯
path.pop_back(); //回溯
}
return;
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k, n, 1, 0);
return res;
}
};
果然昨天做了一道回溯算法题后,今天这道就容易多了。