Leetcode126 组合总和3
回溯三部曲
- 确定递归函数参数
和组合一样需要确定一维数组path来存放结果,result来存放结构集
vector<vector<int>> result;
vector<int> path;
void backtracking(int targetSum, int k, int sum, int startIndex)
- 确定终止条件
if (path.size() == k) {
if (sum == targetSum) result.push_back(path);
return; // 如果path.size() == k 但sum != targetSum 直接返回
}
- 单层搜索过程
for (int i = startIndex; i <= 9; i++) {
sum += i;
path.push_back(i);
backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndex
sum -= i; // 回溯
path.pop_back(); // 回溯
}
总体代码
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtrapping(int targetsum,int k,int sum,int startIndex)
{
if(path.size()==k)
{
if(sum == targetsum) result.push_back(path);
return;
}
for(int i = startIndex;i <= 9 - (k - path.size()) + 1;i++)//剪枝
{
sum+=i;
path.push_back(i);
backtrapping(targetsum ,k ,sum ,i+1);
sum-=i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
backtrapping(n ,k, 0, 1);
return result;
}
};