刷题分享
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;}
};