Day25 回溯第二天
LeetCode 216.组合总和III
算是在上一题组合的基础上多加了一个求和的步骤,总体思路并没有变。
这里直接进行了剪枝操作,把循环的范围变了。
cpp
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.电话号码的字母总和
本题的难点反而不在回溯,而是完成数字到字符串的映射,这部分还是需要好好思考一下才能理解的,完成映射之后就是普通的回溯算法了。
cpp
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;
}
};
回溯第二天,加油!