刷题分享
1.(力扣216)这是一道回溯算法的经典题目。对于回溯算法,一般backtracking是没有返回值的,参数也比较不固定,需要根据每个题的特点来具体分析。这道题因为不能取到重复元素,所以需要额外加一个参数startindex,用来记录每一次开始时所应该取到的元素。在循环内部,一般的逻辑是(单层操作 + 递归 + 回溯),其实回溯的本质就是在递归处理完该层向下的层后,将该层恢复成一开始达到该层时的状态,以便向上返回进行别的分支。所以也叫(恢复现场)
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void backtracking(int k, int exnum, int sum, int startindex) {
if (sum == exnum && k == path.size()) {
res.push_back(path);
return;
}
for (int i = startindex; i <= 9; i++) {
sum += i;
path.push_back(i);
backtracking(k, exnum, sum, i + 1);
sum -= i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k, n, 0, 1);
return res;
}
};
2.(力扣17)首先该题要先使用一个数组,来存放对应位置上的字符串,另外,该题中有一个特殊的参数index,是用来标记现在已经处理到了输入字符串中的哪一个,所以结束条件是(index==digits.size())变量digit是用来存放当前这一层所要操作的字符串的
class Solution {
public:
vector<string> res;
string path;
string help[10]{"", "", "abc", "def", "ghi",
"jkl", "mno", "pqrs", "tuv", "wxyz"};
void backtracking(string& digits, int index) {
if (index == digits.size()) {
res.push_back(path);
return;
}
string digit = help[digits[index] - '0'];
for (int i = 0; i < digit.size(); i++) {
path.push_back(digit[i]);
backtracking(digits, index + 1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if (digits.size() == 0) {
return res;
}
backtracking(digits, 0);
return res;
}
};
标签:11,digits,int,res,30,back,path,backtracking,刷题
From: https://blog.csdn.net/2401_86941858/article/details/144158179