代码随想录 day25

题一:数组总和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;
};

你可能感兴趣的:(卡尔算法营,算法,leetcode,数据结构)