leetcode216. 组合总和 III
作者:互联网
// 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;
// }
// };
class Solution {
public:
vector<vector<int> > ans;
vector<int> path;
//我们定义index可以不断缩小范围,同时也实现不重复
void backtacking(int k,int n,int index,int sum) {
if(path.size() == k) {
if(sum == n){
ans.push_back(path);
return ;
}
}
for(int i = index; i <= 9; i++) {
sum+=i;
path.push_back(i);
backtacking(k,n,i+1,sum);
sum-=i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtacking(k,n,1,0);
return ans;
}
};
标签:index,int,backtacking,sum,vector,path,leetcode216,III,总和 来源: https://blog.csdn.net/qq_48508278/article/details/122724836