day25 3.13 回溯第二天
216.组合总和III
链接: 216.组合总和III
思路:本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。
class Solution {
private:
vector<vector<int>> result;//存放结果集
vector<int> path;//符合条件的结果
//targetSum:目标和,也就是题目中的n
//k:题目中要求K个数的集合
//已经收集的元素的总和,也就是path里元素的总和
//startIndex:下一层for循环搜索的起始位置
void backtracking(int targetSum, int k, int sum, int startIndex){
if(path.size() == k){
if(sum == targetSum) result.push_back(path);
return;//如果path.size() == k 但sum != targetSum直接返回
}
for(int i = startIndex;i <= 9; i++){
sum += i;//处理
path.push_back(i);//处理
backtracking(targetSum,k,sum,i + 1);//注意i+1调整startIndex
sum -= i;//回溯
path.pop_back();//回溯
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();//可以不加
path.clear();//可以不加
backtracking(n,k,0,1);
return result;
}
};
17.电话号码的字母组合
链接: 17.电话号码的字母组合
思路:理解本题后,要解决如下三个问题:
*数字和字母如何映射
*两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来
*输入1 * #按键等等异常情况
class Solution {
private:
const string letterMap[10] ={
"",//0
"",//1
"abc",//2
"def",//3
"ghi",//4
"jkl",//5
"mno",//6
"pqrs",//7
"tuv",//8
"wxyz",//9
};
public:
vector<string> result;
string s;
void backtracking(const string& digits, int index){
if(index == digits.size()){
result.push_back(s);
return;
}
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();//回溯
}
}
vector<string> letterCombinations(string digits) {
s.clear();
result.clear();
if(digits.size() == 0){
return result;
}
backtracking(digits,0);
return result;
}
};