216.组合总和Ⅲ

题目链接:

https://leetcode.cn/problems/combination-sum-iii/

题目描述:

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

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

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

思路:

使用递归回溯的方法,从小到大依次选取数字,将问题转化为选取当前数字+在剩余数字中选取的子问题。终止条件为选取的数字数量为k,递归函数的参数是当前能选取的最小数字,每层递归中选取

当前能选取的最小数字并处理子问题后将选取的数字清除。

代码:

var combinationSum3 = function(k, n) {
    let res = []
    let path = []
    function sum(arr) {
        let s = 0;
        for (let i=arr.length-1; i>=0; i--) {
            s += arr[i];
        }
        return s;
    }
    function backtracking(start){
        if(path.length === k){
            if(sum(path) === n){
                res.push([...path])
            }
            return
        }
        else{
            for(let j = start; j < 10; j++){
                path.push(j)
                backtracking(j + 1)
                path.pop()
            }
        }
    }
    for(let i = 1; i < 10; i++){
        path.push(i)
        backtracking(i + 1)
        path.pop()
    }
    return res
};

17.电话号码的字母组合

题目链接:

https://leetcode.cn/problems/letter-combinations-of-a-phone-number/

题目描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

image-20221211095236809

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

思路:

最直观的想法就是遍历题目给出的数字,多层循环嵌套得出结果。但是组合问题的for循环数往往不确定,很难直接写出。可以使用回溯的方法进行代替,将问题一步一步地解决。由于1回溯法之前提到过很多次,这里就不再赘述了。

本题的输入是数字,要求我们把数字对应的字母写出,这就涉及到一个对应问题了,我使用数组来对应数字与字母。

代码:

var letterCombinations = function(digits) {
    let res = []
    let path = []
    let dic = [
        '',
        '',
        ['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']
    ]
    function backtracking(indexOfDigits){
        if(indexOfDigits === digits.length){
            res.push(path.join(''))
            return
        }
        dic[digits.at(indexOfDigits)].forEach((i)=>{
            path.push(i)
            backtracking(indexOfDigits + 1)
            path.pop()
        })
    }
    if(!digits) return []
    backtracking(0)
    return res
};