代码随想录 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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值