216.组合总和III
如果把 组合问题理解了,本题就容易一些了。
题目链接/文章讲解:代码随想录
视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili
class Solution {
public:
vector<vector<int>>res;
vector<int>path;
int total=0;
void Traversal(int k,int n,int startindex){
if (path.size()==k && total==n){
res.push_back(path);
return;
}
for (int i=startindex;i<=9;i++){
path.push_back(i);
total+=i;
Traversal(k,n,i+1);
path.pop_back();
total-=i;
}
}
vector<vector<int>> combinationSum3(int k, int n) {
Traversal(k,n,1);
return res;
}
};
总结
我记得一刷的时候,开始回溯章节我是十分折磨的,没想到而刷的时候,这些题竟然秒了。
17.电话号码的字母组合
本题大家刚开始做会有点难度,先自己思考20min,没思路就直接看题解。
题目链接/文章讲解:代码随想录
视频讲解:还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibili
class Solution {
public:
vector<string>res;
string path;
vector<string>grid={" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void Traversal(string digits,int startindex){
if (path.size()==digits.size()){
res.push_back(path);
return;
}
for (int i=startindex;i<digits.size();i++){
for (char s:grid[int(digits[i]-'0')]){
path+=s;
Traversal(digits,i+1);
path.pop_back();
}
}
}
vector<string> letterCombinations(string digits) {
if (!digits.empty())Traversal(digits,0);
return res;
}
};
总结
必须保证它的每个值都要遍历到,所以就是liangcengfor循环。