题目描述:
方法1:回溯,注(for循环中,回溯时,记得加上sum -= i)
class Solution {
public:
vector<int> data;
vector<vector<int>> result;
void backtrack(int n,int k,int sum,int StartIndex){
if(data.size()==k){
if(sum==n) result.push_back(data);
return;
}
for(int i=StartIndex;i<=9;i++){
data.push_back(i);
sum += i;
backtrack(n,k,sum,i+1);
sum -= i;
data.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtrack(n,k,0,1);
return result;
}
};
优化,引入剪枝操作,除了通过k限制for循环次数,sum > n 时,也没有必要继续循环
class Solution {
public:
vector<int> data;
vector<vector<int>> result;
void backtrack(int n,int k,int sum,int StartIndex){
if(sum > n)return; //剪枝操作
if(data.size()==k){
if(sum==n) result.push_back(data);
return;
}
for(int i=StartIndex;i<=9-(k-data.size())+1;i++){ //剪枝操作
data.push_back(i);
sum += i;
backtrack(n,k,sum,i+1);
sum -= i;
data.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtrack(n,k,0,1);
return result;
}
};