代码随想录算法训练营第二十二天|77. 组合 、 216.组合总和III 、 17.电话号码的字母组合

12 阅读1分钟

回溯算法:解决组合、子集、切割、棋盘、排列问题

77. 组合

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var combine = function(n, k) {
    var result =[];
    var path=[];
    var backtracking = function(n,k,startIndex){
        if(path.length === k){
            result.push([...path]);
            return;
        }
        for(let i=startIndex;i<=n;i++){
            path.push(i);
            backtracking(n,k,i+1);
            path.pop();
        }
    }
    backtracking(n,k,1);
    return result;
};

216.组合总和III

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var combinationSum3 = function(k, n) {
    var result =[];
    var path =[];
    var sum = 0;
    var backtracking = function(k,  n, startIndex){
        if(path.length ==k && sum === n){
                result.push([...path]);
                return;
        }

        for(let i=startIndex;i<=9;i++){
            path.push(i);
            sum +=i;
            backtracking(k,n,i+1);
            var res = path.pop();
            sum -= res;
        }
    }
    backtracking(k,  n, 1);
    return result;
};

17.电话号码的字母组合

相关链接:题目链接文章讲解 视频讲解

解题思路

代码实现

var letterCombinations = function(digits) {
    var arr = [[],[],['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l'],['m','n','o'],['p','q','r','s'],['t','u','v'],['w','x','y','z']];
    var res =[];
    if(digits.length ===0){
        return res;
    }
    var len = digits.length;
    var str = '';
    var backtracking= function(digits,len,startIndex){
        if(str.length === len){
            res.push(str);
            return;
        }
        for(let i= startIndex; i<len;i++){
            var idx = digits[i] * 1;
            for(let j=0;j<arr[idx].length;j++){
                    str+=arr[idx][j];
                    // 不是 startIndex +1 而是 i+ 1
                    backtracking(digits,len,i+1);
                    str = str.slice(0,str.length-1);
            }
        }
    }
    backtracking(digits,len,0);
    return res;
};