代码随想录算法训练营第25天|16.组合总和III|17.电话号码的字母组合
216.组合总和III
如果把 组合问题理解了,本题就容易一些了。
题目链接/文章讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html
视频讲解:https://www.bilibili.com/video/BV1wg411873x
class Solution {
public:
vector<int>path;// 符合条件的结果
vector<vector<int>> result;// 存放结果集
void backtracking(int targetsum,int k,int sum,int startindex)
{
if(sum>targetsum) return; // 剪枝操作
if(path.size()==k)
{
if(sum==targetsum)
{
result.push_back(path);
return;// 如果path.size() == k 但sum != targetSum 直接返回
}
}
for(int i=startindex;i<=9-(k-path.size())+1;i++)// 剪枝
{
path.push_back(i);// 处理
sum+=i;// 处理
backtracking(targetsum,k,sum,i+1);// 注意i+1调整startIndex
sum-=i;// 回溯
path.pop_back();// 回溯
}
}
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();// 可以不加
path.clear();// 可以不加
backtracking(n,k,0,1);
return result;
}
};
剪枝
17.电话号码的字母组合
本题大家刚开始做会有点难度,先自己思考20min,没思路就直接看题解。
题目链接/文章讲解:https://programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html
视频讲解:https://www.bilibili.com/video/BV1yV4y1V7Ug
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
};
string s;
vector<string> result;
void backtracking(const string &digits,int index)
{
if(index==digits.size())
{
result.push_back(s);
return;
}
int nums=digits[index]-'0';// 将index指向的数字转为int
string str =lettermap[nums];// 取数字对应的字符集
for(int i=0;i<str.size();i++)
{
s.push_back(str[i]);// 处理
backtracking(digits,index+1);// 递归,注意index+1,一下层要处理下一个数字了
s.pop_back(); // 回溯
}
}
vector<string> letterCombinations(string digits) {
result.clear();
s.clear();
if(digits.size()==0)
return result;
backtracking(digits,0);
return result;
}
};