本文旨在记录解题过程中的收获,使用C++
与普通组合问题不同的地方在于要考虑组合中元素的和是多少,所以要引入targetSum,在元素压入栈之前,更新sum的值,递归结束后,要记得更新sum的值(即删除sum的值),将栈里面的元素弹出。
我的代码:
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
backTracking(n,k,0,1);
return result;
}
void backTracking(int targetSum,int k,int sum,int startIndex){
if(path.size()==k){
if(targetSum==sum){
result.push_back(path);
return;
}
}
for(int i=startIndex;i<=9;i++){
sum+=i;
path.push_back(i);
backTracking(targetSum,k,sum,i+1);
sum-=i;
path.pop_back();
}
}
vector<int> path;
vector<vector<int>> result;
};
优化思路:采取剪枝的方法进行优化
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
backTracking(n,k,0,1);
return result;
}
void backTracking(int targetSum,int k,int sum,int startIndex){
if(startIndex>targetSum){
return;
}
if(path.size()==k){
if(targetSum==sum){
result.push_back(path);
return;
}
}
for(int i=startIndex;i<=9-(k-path.size())+1;i++){
sum+=i;
path.push_back(i);
backTracking(targetSum,k,sum,i+1);
sum-=i;
path.pop_back();
}
}
vector<int> path;
vector<vector<int>> result;
};