Day25 回溯第二天
LeetCode 216.组合总和III
算是在上一题组合的基础上多加了一个求和的步骤,总体思路并没有变。
这里直接进行了剪枝操作,把循环的范围变了。
class Solution {
private:vector<vector<int>> res;vector<int> path;
public:void dfs(int n,int k,int sum,int startidx){if(sum>n) return;if(path.size()==k){if(sum==n) res.push_back(path);return;}for(int i=startidx;i<=9-(k-path.size())+1;i++){sum+=i;path.push_back(i);dfs(n,k,sum,i+1);sum-=i;path.pop_back();}}vector<vector<int>> combinationSum3(int k,int n) {dfs(n,k,0,1);return res; }
};
LeetCode 17.电话号码的字母总和
本题的难点反而不在回溯,而是完成数字到字符串的映射,这部分还是需要好好思考一下才能理解的,完成映射之后就是普通的回溯算法了。
class Solution {
private:const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};
public:string s;vector<string> res;void backtrack(const string& digits,int index){if(index==digits.size()){res.push_back(s);return;}int digit=digits[index]-'0';string letter=letterMap[digit];for(int i=0;i<letter.size();i++){s.push_back(letter[i]);backtrack(digits,index+1);s.pop_back();}}vector<string> letterCombinations(string digits) {if(digits.size()==0) return res;backtrack(digits,0);return res;}
};
回溯第二天,加油!