目录
回溯算法模板:base case(终止条件)+for循环(纵向递归+撤销操作)
1. LeetCode77. 组合
class Solution {
public:
vector<vector<int>>res;
vector<int>path;
void backTracking(int start,int n,int k){
if(path.size()==k){
res.push_back(path);
}
for(int i=start;i<=n-(k-path.size())+1;i++){//减枝,因为path的大小有限制
path.push_back(i);
backTracking(i+1,n,k);
path.pop_back();//回溯
}
}
vector<vector<int>> combine(int n, int k) {
backTracking(1,n,k);
return res;
}
};
2. LeetCode216. 组合总和 III
class Solution {
public:
vector<vector<int>>res;//结果集
vector<int>path;//路径
int pathSum;//路径和
void backTracking(int startIndex,int k,int n){
if(path.size()>k||pathSum>n){//剪枝
return;
}
if(path.size()==k&&pathSum==n){
res.push_back(path);
return;
}
for(int i=startIndex;i<=9-(k-path.size())+1;i++){//剪枝
path.push_back(i);
pathSum+=i;
backTracking(i+1,k,n);
//回溯
path.pop_back();
pathSum-=i;
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backTracking(1,k,n);
return res;
}
};
3. LeetCode17. 电话号码的字母组合
思路:
1.创建映射表vector<string>
2.确定递归深度(终止条件)
3.确定递归宽度(for循环)
class Solution {
public:
vector<string>res;//结果集
string path;//路径
vector<string>letterMap;//映射表
void backTracking(string digits,int startIndex){
if(startIndex==digits.size()){
res.push_back(path);
return;
}
int digit=digits[startIndex]-'0';
string letter=letterMap[digit];
for(int i=0;i<letter.size();i++){
path.push_back(letter[i]);
backTracking(digits,startIndex+1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
//初始化path
path.clear();
res.clear();
if(digits.size()==0)return res;
//完善映射表
letterMap={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
backTracking(digits,0);
return res;
}
};