代码随想录算法训练营Day25 | 216.组合总和III,17.电话号码的字母组合

216.组合总和III

如果把 组合问题理解了,本题就容易一些了。

题目链接

题目

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

只使用数字1到9
每个数字 最多使用一次 
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

答案

/**
 * @param {number} k
 * @param {number} n
 * @return {number[][]}
 */
var combinationSum3 = function(k, n) {
    let res = [], sum = 0, path = [];
    const backtracking = function(k, n, startIndex) {
        if(sum === n && path.length === k) {
            res.push([...path]);
            return;
        }
        for(let i = startIndex; i < 10; i++) {
            path.push(i); sum += i;
            backtracking(k, n, i+1);
            path.pop(); sum -= i;
        }
    }
    backtracking(k, n, 1);
    return res;
};

17.电话号码的字母组合

本题大家刚开始做会有点难度,先自己思考20min,没思路就直接看题解。

题目链接

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

1-   2-abc 3-def
4-ghi 5-jkl 6-mno
7-pqrs 8-tuv 9-wxyz

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

答案

/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
    if (!digits.length) return [];
    const lettersMap = [
        '',
        '',
        'abc',
        'def',
        'ghi',
        'jkl',
        'mno',
        'pqrs',
        'tuv',
        'wxyz'
    ]
    const res = [], path = []
    // index 指的是遍历的深度
    const backtracking = function(index) {
        if(index === digits.length) {
            res.push(path.join(''));
            return;
        }
        const digit = digits[index], letters = lettersMap[digit];
        for(let i = 0; i < letters.length; i++) {
            path.push(letters[i]);
            backtracking(index + 1);
            path.pop();
        }
    }
    backtracking(0);
    return res;
};

你可能感兴趣的:(算法,算法,javascript,开发语言)