题一:数组总和III
题目链接: 数组总和III
解题思路: 把解题过程抽象成一颗构造好的树,采用深度优先遍历的思想(方便我们回溯),具体的解题树见代码随想录视频,在最后一步终止递归的时候,需要通过路径判断sum和给定值是否相等。
解题代码:
var combinationSum3 = function (k, n) {
let path = [];
let result = [];
// let overed = [];
let sum = 0;
let backtrenking = function (k, n, startIndex) {
if (path.length === k) {
if (sum === n) {
let temp = JSON.parse(JSON.stringify(path));
result.push(temp);
}
return;
}
for (let i = startIndex; i <= 9; i++) {
path.push(i);
sum += i;
backtrenking(k, n, i + 1);
sum -= path.pop();
}
}
backtrenking(k, n, 1);
return result;
};
题二: 电话号码的字母组合
题目链接: 电话号码的字母组合
解题思路: 还是组合的问题,首先我们得设定一个数字字符对照表lettermap,每一次递归都要跳到下一个数字,每一次回溯都得倒退到前一个字母。
解题代码:
var letterMap = [
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
]
var letterCombinations = function(digits) {
let result = [];
let str = [];
let backtrenking = function(digits,index){
if(index === digits.length){
if(!str.length)return;
result.push(str.join(""));
return;
}
let digit = digits[index] - "0";
let letter = letterMap[digit];
for(let i = 0;i < letter.length;i++){
str.push(letter[i]);
backtrenking(digits,index+1);
str.pop();
}
}
backtrenking(digits,0);
return result;
};