训练营打卡Day25
文章目录
题62:216. 组合总和 III
思路
回溯算法通过调用函数 backTrack(k, n, index) 来求解问题。该函数接收三个参数:
- k:要选择的数字个数。
- n:要求和的数字。
- index:下一个数字的起始索引。
函数 backTrack(k, n, index) 的主要逻辑如下:
- 如果n < 0,说明选择的数字的和已经超过了n,此时可以直接返回。
- 如果n = 0且当前选择的数字的个数正好为k,说明找到了一组解,将这组解存入答案数组中。
- 否则,从index开始,依次选择数字i,并调用 backTrack(k, n-i, i+1) 递归地求解剩余的数字。最后,将数字i从当前路径中弹出。
这样,回溯算法就可以通过不断地递归和回溯来枚举所有可能的解,找到最终的解。
代码
class Solution {
public:
vector< vector<int> >ans;
vector<int>path;
void backTrack(int k, int n, int index)
{
if(n < 0)
{
return;
}
if(n == 0 && path.size() == k)
{
ans.push_back(path);
return;
}
for(int i = index; i <= 9 - (k - path.size()) +1; i++)
{
path.push_back(i);
backTrack(k, n-i, i+1);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backTrack(k, n, 1);
return ans;
}
};
题63:17. 电话号码的字母组合
思路
- 首先,定义一个 letterMap 数组,其中存储了每个数字对应的字母。
- 然后定义一个 vector 变量 result,用于存储所有可能的字母组合,并定义一个字符串变量 path,用于临时存储单个字母组合。
- 接着,定义一个函数 backTrack,该函数使用递归的方式生成所有可能的字母组合。参数 digits 表示输入的电话号码,index 表示当前处理的数字在 digits 中的位置。如果 index 等于 digits 的长度,说明所有数字都已处理完毕,将 path 加入 result 中,然后返回。
- 否则,从 digits 中取出当前数字,并根据 letterMap 数组查找该数字对应的所有字母。对于每个字母,将其加入 path 中,然后继续递归调用 backTrack 函数,并将 index 加 1,表示处理下一个数字。最后,将当前字母从 path 中弹出,以便返回上一层递归时使用。
- 最后,定义一个函数 letterCombinations,该函数是题目要求的入口函数。如果输入的电话号码为空,则返回空 vector。否则,调用 backTrack 函数,并传入电话号码和起始索引 0,开始生成字母组合。否则,调用 backTrack 函数,并传入电话号码和起始索引 0,开始生成字母组合。
代码
class Solution {
public:
const string letterMap[10] =
{
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
vector<string>result;
string path;
void backTrack(string digits, int index)
{
if(digits.size() == index)
{
result.push_back(path);
return;
}
int digit = digits[index] - '0';
for(auto ch: letterMap[digit])
{
path.push_back(ch);
backTrack(digits, index+1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.empty()) return {};
backTrack(digits, 0);
return result;
}
};