216. 组合总和 III
回溯三部曲
1、确定递归函数参数------定义path 和 result为全局变量;
- n(int)目标和;
- k(int)就是题目中要求k个数的集合;
- sum(int)为已经收集的元素的总和,也就是path里元素的总和。
- start(int)为下一层for循环搜索的起始位置。
vector<vector<int>> result;
vector<int> path; //存放单层path结果
//sum:已经收集的元素的总和,也就是path里元素的总和
//startIndex:下一层for循环搜索的起始位置
void backtracking(int k, int n, int sum, int start)
2、确定终止条件------如果path.size() 和 k相等了,就终止;如果此时path里收集到的元素和(sum) 和targetSum(就是题目描述的n)相同了,就用result收集当前的结果
if (path.size() == k) {
if (sum == n) result.push_back(path); //当sum==n时,path中元素个数与K相等才能放入
return ;
}
3、 单层搜索过程------回溯过程中sum有加必有减
for (int i = start; i <= 9; i++) {
sum += i;
path.push_back(i);
backtracking(k, n, sum, i + 1);
sum -= i;
path.pop_back();
}
17. 电话号码的字母组合
首先解决问题数字与字母之间的映射------可以使用map或者定义一个二维数组,例如:string letterMap[10],来做映射
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
回溯三部曲
1、确定回溯函数参数------定义全局变量vector<string>存放结果集,定义string存放单次结果;参数指定是有题目中给的string digits,然后还要有一个参数就是int型的index
vector<string> result;
string s;
void backtracking(const string& digits, int index)
2、确定终止条件------如果index 等于 输入的数字个数(digits.size);然后收集结果,结束本层递归
if (index == digits.size()) {
result.push_back(s);
return;
}
3、确定单层遍历逻辑------首先要取index指向的数字,并找到对应的字符集(手机键盘的字符集);首先要取index指向的数字,并找到对应的字符集(手机键盘的字符集)
int digit = digits[index] - '0'; // 将index指向的数字转为int
string letters = letterMap[digit]; // 取数字对应的字符集
for (int i = 0; i < letters.size(); i++) {
s.push_back(letters[i]); // 处理
backtracking(digits, index + 1); // 递归,注意index+1,一下层要处理下一个数字了
s.pop_back(); // 回溯
}
本题代码如下:
class Solution {
public:
//完成字母与数字的映射
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
vector<string> result; //存放结果集
string path; //存放单次结果
void backtracking(const string& digits, int index) {
//终止条件
if (index == digits.size()) {
result.push_back(path);
return ;
}
//单词搜索过程
int digit = digits[index] - '0'; //将数字转换为int型,方便取值
string letters = letterMap[digit]; //去数字对应字符串
for (int i = 0; i < letters.size(); i++) {
path.push_back(letters[i]);
backtracking(digits, index + 1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
result.clear();
path.clear();
if (digits.size() == 0) return result;
backtracking(digits, 0);
return result;
}
};