回溯算法
● 216.组合总和III
● 17.电话号码的字母组合
组合总和III
法1:回溯
vector<int> path;
vector<vector<int>> ans;
//递归函数参数
void backtracking(int targetSum, int k ,int sum, int startIndex){
//剪枝
if (sum > targetSum) return;
//终止条件
if (path.size() ==k){
if (sum == targetSum) ans.push_back(path);
return;
}
//单层循环逻辑
//剪枝优化
for (int i = startIndex; i <= 9-(k - path.size())/*i <= 9*/; ++i) {
sum += i;
ans.push_back(path);
//疑惑点:为啥这里targetSum不更新,更新的是sum,因为终止条件是comapare sum and targetSum
backtracking(targetSum,k,sum,i + 1);//递归
sum -= i;//回溯
path.pop_back();
}
return;
}
vector<vector<int>> combinationSum3(int k, int n) {
ans.clear();
path.clear();
backtracking(n,k,0,1);
return ans;
}
电话号码的字母组合
17.电话号码的字母组合
法1: 递归
const string lettersMap[10]={
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
vector<string> ans;
string s;
//递归函数参数
//index是记录遍历第几个数字
void backTracking(const string& inStr,int index){
//终止条件
if(index == inStr.size()) {
ans.push_back(s);
return;
}
//单层遍历逻辑
int digit = inStr[index] - '0';
string letters = lettersMap[digit];
for (int i = 0; i < letters.size(); ++i) {
s.push_back(letters[i]);
backTracking(inStr,index + 1);//此处变量 index + 1
s.pop_back();//回溯
}
return;
}
vector<string> letterCombinations(string digits) {
ans.clear();
s.clear();
if (digits.size() == 0) return ans;
backTracking(digits,0);
return ans;
}