216.组合总和III
题目链接/文章讲解/视频讲解:代码随想录
//216.组合总和Ⅲ
vector<int> path;
vector<vector<int>> result;
int combinationSum = 0;
void combinationSum3Backtracking(int k, int targetSum, int startIndex, int& sum) {
//step1 确定参数
//step2 确定终止条件
//必须要在path的size()等于
//k的时候才能判断,否则不满足题意
//剪枝情况二:对sum已经大于targetSum的情况进行剪枝.
//这种情况发生在path.size() < k时
if (sum > targetSum) {
return;
}
if (path.size() == k) {
if (targetSum == sum) {
result.push_back(path);
return;
}
}
//step3 确定单层逻辑
// 剪枝情况一:对即使遍历到最底层也是
//path.size() < k的情况进行剪枝
//for (int i = startIndex; i <= 9; i++)
for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
sum += i;
path.push_back(i);
combinationSum3Backtracking(k, targetSum, i + 1, sum);
path.pop_back();
sum -= i;
}
return;
}
vector<vector<int>> combinationSum3(int k, int n) {
combinationSum3Backtracking(k, n, 1, combinationSum);
return result;
}
2.本题小节
基本思路:本题和组合的思路很像。注意递归的终止条件,在path的size等于k时才能进行判断;单层递归逻辑和组合的一样,但是要注意回溯时多了sum;注意剪枝的两种情况,一种和startIndex有关,另外一种是和sum有关。
17.电话号码的字母组合
题目链接/文章讲解/视频讲解:代码随想录
1.代码展示
//17电话数字组合
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
vector<string> vsLetterResult;
string path;
void letterCombinationsBackTracking(const string& digits, int index) {
//step1 确定参数
//step2 确定终止条件
if (index == digits.size()) {
//vsLetterResult.push_back(path);
return;
}
//step3 确定单层迭代逻辑
//每次遍历前取出待遍历的字母
int nIndex = digits[index] - '0';
string letter = letterMap[nIndex];
//开始遍历
for (int i = 0; i < letter.size(); i++) {
path.push_back(letter[i]);
//递归
letterCombinationsBackTracking(digits, index + 1);
//回溯
path.pop_back();
}
return;
}
vector<string> letterCombinations(string digits) {
if (digits.size() == 0) {
return vsLetterResult;
}
letterCombinationsBackTracking(digits, 0);
return vsLetterResult;
}
2.本题小节
基本思路:本题与上一题不同的是,在两个数组中进行操作,不存在startIndex的情况,但是参数中存在index,这里的index主要是用来作为digits的下标寻找对应的字母的,在进行遍历前,需要把这些字母取出来,再对这些字母进行遍历;终止条件是index == digits.size()时,此时存入path的结果。
思考:这里的index作为全局变量的话比较麻烦,最开始搞错了,将index作为了全局变量,每次遍历前++,忽然间懂了,这里的index也需要回溯,就在写博客的时候又去测试了一下,果然是的,每次遍历前++,遍历完毕后再--也可以。