一:题目
二:思路
1.总体来看这是一个解空间为k层的排列树 第一层为1~9
2.递归函数的参数和返回值
1>:返回值:vector<vector > res
每次的求解结果:vector path
2>:参数:
backtacking(int k,int n,int index,int sum)
这里需要的index是 因为我们每次往下递归的时候 我们的返回在 缩小
3.递归函数的终止条件为
k == path.size(),这里可能使 结果并不满足 n == sum 但也要结束递归,寻找下一个可行解即可
4.横向单层的for循环的为(1~9),纵向为递归的k层
三:上码
class Solution {
public:
vector<vector<int> > ans;
vector<int> path;
void backtacking(int k,int n,int index,int sum){
if (path.size()== k) {
if (n == sum) ans.push_back(path);
return;//如果 path.size() == k 而 n != sum 直接结束本次循环
}
for (int i = index; i <= 9; i++) {
sum += i;
path.push_back(i);
backtacking(k,n,i+1,sum);
path.pop_back();//
sum -= i;//注意的是每次往上回溯的时候我们都需要将上一层存进去的剪掉,为其他可行解提供空间
}
}
vector<vector<int>> combinationSum3(int k, int n) {
/*思路:
1.总体来看这是一个解空间为k层的排列树 第一层为1~9
2.递归函数的参数和返回值
1>:返回值:vector<vector<int> > res
每次的求解结果:vector<int> path
2>:参数:
backtacking(int k,int n,int index,int sum)
这里需要的index是 因为我们每次往下递归的时候 我们的返回在 缩小
3.递归函数的终止条件为
k == path.size(),这里可能使 结果并不满足 n == sum 但也要结束递归,寻找下一个可行解即可
4.横向单层的for循环的为(1~9),纵向为递归的k层
*/
backtacking(k,n,1,0);
return ans;
}
};