1.216. 组合总和 III和昨天的组合体很像,自己也能写出来,但是单层回溯这块第一次没完整写出来,看了解析就顺畅了。
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracing(int k,int n,int sum,int startIndex){
if (path.size()==k){
if(sum==n) result.push_back(path);
return;//如果不等于n,直接返回
}
for(int i=startIndex;i<=9;i++){
sum+=i;
//path.push_back(sum);之前写错了成这个了
path.push_back(i);
backtracing(k,n,sum,i+1);
//回溯的过程
sum-=i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
int sum=0;
int startIndex=1;
backtracing(k,n,0,1);
return result;
}
};
17. 电话号码的字母组合思路和之前的组合问题一样,如果输入两个数字,那么树的深度就是2,当index遍历到2时就可以收割答案了。
class Solution {
private:
//先用二维数组做一个映射,把数字和字母映射
const string letterMap[10]{
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
public:
vector<string> result;
string s;
//index指的是遍历到输入的第几个数字了,相当于树的path深度
void backtracing(const string& digits,int index){
if(index==digits.size()){
result.push_back(s);
return ;
}
//取出输入数字对应字母
int digit = digits[index]-'0';
string letter = letterMap[digit];
for(int i=0;i<letter.size();i++){
s.push_back(letter[i]);
backtracing(digits,index+1);
s.pop_back();
}
}
vector<string> letterCombinations(string digits) {
s.clear();
//result.push_back(s);
if(digits.size()==0) return result;
backtracing(digits,0);
return result;
}
};