回溯算法三步法
1. 确定递归函数参数
本题需要一维数组path来存放符合条件的结果,二维数组result来存放结果集。定义path 和 result为全局变量。接下来还需要如下参数:
- targetSum(int)目标和,也就是题目中的n。
- k(int)就是题目中要求k个数的集合。
- sum(int)为已经收集的元素的总和,也就是path里元素的总和。
- startIndex(int)为下一层for循环搜索的起始位置。
代码:vector<vector<int>> result; vector<int> path; void backtracking(int targetSum, int k, int sum, int startIndex)
2.确定终止条件
如果path.size() 和 k相等了,就终止。如果此时path里收集到的元素和(sum) 和targetSum(就是题目描述的n)相同了,就用result收集当前的结果。所以 终止代码如下:
if (path.size() == k) { if (sum == targetSum) result.push_back(path); return; // 如果path.size() == k 但sum != targetSum 直接返回 }
3.单层搜索过程
#include<iostream>
#include<vector>
using namespace std;
class Solution {
private:
vector<vector<int>> ans;
vector<int> path;
public:
void backtracking(int sumTarget, int k, int sum, int startIndex){
if (sum>sumTarget){
return ;
}
if (path.size()==k){
if (sum==sumTarget){
ans.push_back(path);
}
return ;
}
for(int i=startIndex; i<=9; i++){
sum+=i;
path.push_back(i);
backtracking(sumTarget, k, sum, i+1);
sum-=i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(n, k, 0, 1);
return ans;
}
};
int main(){
int k=3, n=11;
Solution S;
vector<vector<int>> ans=S.combinationSum3(k,n);
for(int i=0;i<ans.size(); i++){
for(int j=0; j<ans[i].size();j++){
cout<<ans[i][j];
}
cout<<endl;
}
return 0;
}
结果:
128
137
146
236
245