216.组合总和
1、关键:递归终止条件前判断sum是否等于targetSum
2、代码:
class Solution {
private:
vector<int> path;
vector<vector<int>> res;
//递归函数
void backtracking(int k, int n, int sum, int StartIndex){
//递归终止条件
if(path.size()==k){
if(sum == n) res.push_back(path);
return;
}
for(int i = StartIndex; i<=9; i++){
sum += i;
path.push_back(i);
backtracking(k, n, sum, i+1);//递归
sum -= i; //回溯
path.pop_back();//回溯
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k, n, 0, 1);
return res;
}
};
17.电话号码的字母组合
1、关键:用回溯,不再用StartIndex+1,因为是两个集合里面找组合
2、代码:
class Solution {
private:
vector<string> StringVec = {
"","","abc","def",
"ghi","jkl","mno",
"pqrs","tuv","wxyz"
};
string s;
vector<string> res;
//递归函数
void backtraking(string digits, int index){
if(index == digits.size()){//递归终止条件
res.push_back(s);
return;
}
string letter = StringVec[(digits[index]-'0')];
for(int i=0; i<letter.size(); i++){//循环
s.push_back(letter[i]);
backtraking(digits, index+1);
s.pop_back();
}
}
public:
vector<string> letterCombinations(string digits) {
if(digits.size() == 0) return res;
backtraking(digits, 0);
return res;
}
};