思路:本题除了给定数组外,又指定了结果的长度,我们根据前面两道题的套路很容易解决。
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>>res;
if(k==0) return res;
vector<int>path;
backtrack(1,k,n,res,path);
return res;
}
//参数依次是:起始元素,路径个数,目标值,结果,路径
void backtrack(int begin,int k,int n,vector<vector<int>>&res,vector<int>&path){
if(n==0&&k==0){
res.push_back(path);
return;
}
//此处i不再是数组下标,直接是供选择的值
for(int i=begin;i<=9;i++){
//剪枝,目标值小于0或长度小于0,结束本轮循环
if(n-i<0||k<0) break;
//选择元素
path.push_back(i);
backtrack(i+1,k-1,n-i,res,path);
//撤销选择
path.pop_back();
}
}
};