代码随想录算法训练营Day25 | 216.组合总和III 17.电话号码的字母组合
LeetCode 216.组合总和III
题目链接:LeetCode 216.组合总和III
思路:
1.和组合数类似。需要明确返回条件,如果=k,返回,如果=sum,收集结果。
2.判断终止条件剪枝
(1)sum>n
(2) index < n-(k-path.size())+1 边界条件可举例。
class Solution {
public:
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-(k-path.size())+1; i++){
if(Sum + i > n) return;
path.push_back(i);
backtracking(k,n, Sum + i, i+1);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
path.clear();
res.clear();
backtracking(k, n, 0, 1);
return res;
}
};
注意 :
- 返回条件以及剪枝
LeetCode 17.电话号码的字母组合
思路:
1.遍历字符串、回溯
class Solution {
public:
const string letterMap[10]={
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
string path;
vector<string> res;
void backtracking(string& digits, int index){
if(index == digits.size()){
res.push_back(path);
return;
}
int digit = digits[index]-'0';
//cout<<index;
cout<<digits[index];
string cur = letterMap[digit];
for(char str:cur){
path.push_back(str);
backtracking(digits, index+1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
res.clear();
if(!digits.size()) return res;
backtracking(digits, 0);
return res;
}
};
注意 :
- 用数组建立字符串与数组的映射
- 注意遍历的是每个数字对应的字符串,并回溯
- 终止条件是index的长度为字符串长度