【算法】leetcode 216.组合总和III 17. 电话号码的字母组合

【算法】代码随想录训练营Day24打卡, 216.组合总和III 17. 电话号码的字母组合


)

216.组合总和III

力扣链接:https://leetcode.cn/problems/combination-sum-iii/description/

这道题其实就是 77. 组合的一个升级版本,
我们发现,他需要求一个sum,数字只有1-9
那么我们横向的for里,最大的值为9,根据77.组合里的剪枝的思路,我们需要一个start,来减去重复的枝叶
而我们的结束条件则是 负责组合数字的数组长度 === k
而我们收录上述数组的条件则是 Sum == n
所以综上述
我们的dfs应该有三个入参,分别是
负责组合数字的数组 arr,
负责每一条分枝的和的值 sum,
以及负责剪枝避免重复的值 start

解法

/**
 * @param {number} k
 * @param {number} n
 * @return {number[][]}
 */
var combinationSum3 = function(k, n ) {
 

    let res = [];
    let dfs = function(result,sum,start){
        if(result.length == k){
            if(sum==n){
                res.push([...result])
            }
            return;
        }
        for(let i=start;i<=9;i++){


            result.push(i);
            dfs(result,sum+i,i+1);

            result.pop();
        }
    }
    dfs([],0,1);
    return res;
};

17. 电话号码的字母组合

力扣链接: https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/

这道题其实就是一个很标志的回溯算法问题了,
在数学中也叫做排列组合

题目的意思也很好理解,我们就是要根据输入的按钮数字,来对应映射出可能出现的字母组合方式
那么如何映射按键和字母呢?
其实可以用的方式很多
如通过数组下标来映射

 const numarr = ["","","abc","def","ghi","jkl","mno","pqrs",'tuv',"wxyz"]

或者通过map来映射

 const note = {
        "2":["a","b","c"],
        "3":["d","e","f"],
        "4":["g","h","i"],
        "5":["j","k","l"],
        "6":["m","n","o"],
        "7":["p","q","r","s"],
        "8":["t","u","v"],
        "9":["w","x","y","z"]
    }

然后我们再来看,根据dfs的模板,我们首先来确认一下结束的条件

应该是组合的数组的长度 与 输入的字符串长度 digtes的长度相等 就结束

所以结束的条件应该是

 if(arr.length === digtes.length){
 	return res.push(arr) // arr是应有的字母组合
 }

那么我们的循环的条件就是按键对应的字母的长度 在这里面遍历取

综上所述解法如下

解法

/**
 * @param {string} digits
 * @return {string[]}
 */


var letterCombinations = function(digits) {
    const res = [];
    if(digits.length === 0 ) return res;
    const numarr = ["","","abc","def","ghi","jkl","mno","pqrs",'tuv',"wxyz"]
    const dfs = (arr,number)=>{
        if(arr.length === digits.length){
                return res.push( arr.join(""))
           
        }
        let curArr = numarr[parseInt(digits[number])];;
        for(let i=0;i<curArr.length;i++){
            arr.push(curArr[i]);
            dfs(arr,number+1);
            arr.pop();
        }
    }
    dfs([],0);
    return res;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值