代码随想录算法训练营第二十五天|● 216.组合总和III ● 17.电话号码的字母组合(JS写法)

216 组合总和Ⅲ

题目链接/文章讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html
视频讲解:https://www.bilibili.com/video/BV1wg411873x
在这里插入图片描述

方法一:自己写的

自己写的,本题和77很像,就是在backTracking的终止条件里多加了一个条件,也就是sum===n

/**
 * @param {number} k
 * @param {number} n
 * @return {number[][]}
 */
var combinationSum3 = function(k, n) {
    let res = [];
    let path = [];
    const backTracking = (n,k,start) => {
        let sum = 0;
        if(path.length === k){
            for(let j = 0;j< path.length;j++){
                sum += path[j];
            }
            if(sum === n){
                res.push([...path]);
                return;
            }
            
        }
        for(let i = start;i<=9;i++){
            path.push(i);
            backTracking(n,k,i+1);
            path.pop();
        }
    }
    backTracking(n,k,1);
    return res;
};

方法二:代码随想录的方法

把处理sum的逻辑放在了for循环里面,因此除了path要回溯,sum也要回溯

/**
 * @param {number} k
 * @param {number} n
 * @return {number[][]}
 */
var combinationSum3 = function(k, n) {
    let res = [];
    let path = [];
    let sum = 0;
    const backTracking = (start,path) => {
        //终止条件
        //剪枝
        if (sum > n){
            return;
        }
        if(path.length === k){
            if(sum === n){
                res.push([...path]);
                //使用return,一旦找到正确的结果,就结束当前的递归分支
                return;
            }
        }
        //单层逻辑
        for(let i = start;i<=9-(k-path.length) + 1;i++){
            sum += i;
            path.push(i);
            backTracking(i+1,path);
            path.pop();
            //回溯
            sum -= i;
        }
    }
    backTracking(1,path);
    return res;

};

17 电话号码的字母组合

题目链接/文章讲解:https://programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html
视频讲解:https://www.bilibili.com/video/BV1yV4y1V7Ug
在这里插入图片描述

/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
    //digits的长度,就是树的深度
    const k = digits.length;
    //该数组对应0,1,2,3,4,5,6,7,8,9
    const map = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"];
    //处理两种特殊情况
    if(!k) return [];
    if(k === 1) return map[digits].split("");
    let path = [];
    let res = [];
    //k不作为参数传递也可以
    const backTracking = (str,k,index) => {
        //终止条件
        //k既是树的深度,也是正确结果的长度
        if(path.length === k){
            res.push(path.join(""));
            return;
        }
        //str[index],假设digits="23",则第一轮str[index]=2
        //map[str[index]],map[2]="abc"
        //v就是依次取a,b,c
        for(const v of map[str[index]]){
            path.push(v);
            backTracking(str,k,index+1);
            path.pop();
        }
    }
    backTracking(digits,k,0);
    return res;
};

注意!k和k===null的区别
if(!k):这个条件判断语句会在 k 的值为假值的情况下执行。在 JavaScript 中,以下值被视为假值(Falsy value):
false
0
‘’(空字符串)
null
undefined
NaN

因此,if(!k) 会在 k 的值为假值时执行代码块,其中包括当 k 为 0 或空字符串 ‘’ 的情况。
if(k === null):这个条件判断语句会严格检查 k 的值是否为 null。如果 k 不是 null,则条件不满足,代码块不会执行。

在考虑代码逻辑时,根据实际情况选择合适的条件判断形式很重要。在提供的代码中,digits 是一个字符串,而 map 中的每个对应项都是包含字母的字符串。因此,用 if(!k) 来判断 digits 的长度是否为 0 是合适的,因为 k 代表了 digits 字符串的长度,而 k 为 0 时表示没有输入数字,因此应该返回空数组 []。使用 if(k === null) 则无法正确捕捉到 k 为 0 的情况。

思路

在这里插入图片描述
图中可以看出遍历的深度(之前的两道题,都是题干提供了规定的长度,可能是k什么的,本题没有明确说明,因此需要自己想象出树的结构,知道digits的长度就是遍历的深度),就是输入"23"的长度,而叶子节点就是我们要收集的结果。
k也是最后结果的长度

注意这个index可不是 77.组合 (opens new window)和216.组合总和III (opens new window)中的startIndex了。
这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/466698.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

连号区间数c++

题目 输入样例1&#xff1a; 4 3 2 4 1输出样例1&#xff1a; 7输入样例2&#xff1a; 5 3 4 2 5 1输出样例2&#xff1a; 9样例解释 第一个用例中&#xff0c;有 77 个连号区间分别是&#xff1a;[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4][1,1],[1,2],[1,3],[1,4],[2,2…

关于Oracle Primavera P6的各数据库帐号用途

在使用/维护P6时&#xff0c;经常会用到各种不同的P6数据库用户&#xff0c;如在连接配置P6 Professional时用到的公共帐号pubuser&#xff0c;进入后台维护p6配置信息(adminpv)或开发常连接的privuser&#xff0c;亦或是配置BI Report/BUSINESS Intelligence报表套件用到的pxr…

Axure 中继器的Item属性介绍及使用

item.列名 获取数据行中指定列的值。 index 获取索引编号&#xff0c;编号起始值为1 isFirst 判断数据是否为第一行 isLast 判断是否为最后一行 isEven 判断是否为偶数行 isOdd 判断是否为奇数行 isMarked 判断行是否被标记 isVisible 改行是否为显示

8年测试总结,自动化测试必要注意点+自动化测试框架(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、开始自动化测试…

工具精灵--超级好用的在线工具网站

工具精灵是一个超级好用的在线工具网站&#xff0c;它有这些功能&#xff1a;json格式化、xml格式化、markdown在线编辑、sql格式化、json转Java、xml转Java等。 虽然有很多这种类似的网站了&#xff0c;但它们并不好用&#xff0c;很粗糙。工具精灵超级好用&#xff0c;细节方…

详解Python中的缩进和选择

缩进 Python最具特色的是用缩进来标明成块的代码。我下面以if选择结构来举例。if后面跟随条件&#xff0c;如果条件成立&#xff0c;则执行归属于if的一个代码块。 先看C语言的表达方式&#xff08;注意&#xff0c;这是C&#xff0c;不是Python!&#xff09; if ( i > 0 …

el-upload的多个文件与单个文件上传

样式图&#xff1a; 场景多个&#xff1a; 使用el-upload上传多个文件 <el-upload class"upload-demo" :action"uploadUrl" :on-remove"handleRemove1":on-success"handleAvatarSuccess1" multiple :limit"5" :on-exc…

gma 2.0.7 (2024.03.16) 更新日志

安装 gma 2.0.7 pip install gma2.0.7网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版继…

阿里云服务器1个月收费价格表,5元1个月起

阿里云服务器一个月多少钱&#xff1f;最便宜5元1个月。阿里云轻量应用服务器2核2G3M配置61元一年&#xff0c;折合5元一个月&#xff0c;2核4G服务器30元3个月&#xff0c;2核2G3M带宽服务器99元12个月&#xff0c;轻量应用服务器2核4G4M带宽165元12个月&#xff0c;4核16G服务…

现货白银是伦敦银吗?要看这个因素

在国际贵金属投资市场上&#xff0c;伦敦银就是现货白银交易的别名&#xff0c;但这仅仅是指以“美元/盎司”计价、在全球化的网络进行的正宗国际现货白银交易&#xff0c;一些个别国家和地区的现货白银交易&#xff0c;可不能称为伦敦银交易。 伦敦作为全球金融中心之一&#…

Java微服务分布式事务框架seata

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

深度强化深化03 Rewards and Returns

Return Value Function Vpei当前的局势好不好 自动驾shi方向盘的角度

AIGC元年大模型发展现状手册

零、AIGC大模型概览 AIGC大模型在人工智能领域取得了重大突破&#xff0c;涵盖了LLM大模型、多模态大模型、图像生成大模型以及视频生成大模型等四种类型。这些模型不仅拓宽了人工智能的应用范围&#xff0c;也提升了其处理复杂任务的能力。a.) LLM大模型通过深度学习和自然语…

【Python循环3/5】条件循环语句

目录 导入 条件循环 边界条件 while循环 死循环 while循环与for循环的区别 总结 知识图谱 导入 我们已经学习了如何利用for语句实现代码重复执行的循环结构。通过遍历列表&#xff0c;输出其中的每一个元素。 for循环就像是排队办事&#xff0c;一个个进入&#xff0c;轮…

一个注解解决接口耗时日志的打印

在日常开发中&#xff0c;常常需要统计方法的耗时情况&#xff0c;一般的写法是在进入方法之前&#xff0c;记录一下当前时间戳&#xff0c;在方法最后再用当前时间戳减去进入时候的时间戳就是耗时情况&#xff0c;方法很简单&#xff0c;但不够优雅。 接下来我们用一个注解AOP…

吴恩达机器学习笔记 二十四 决策树模型 学习过程 什么时候停止分裂 如何选择结点特征

案例&#xff1a;识别小猫&#xff0c;上面这个分类的特征 x 采用分类值&#xff08;几个离散的值&#xff09; 决策树最顶端的结点称根结点(root node)&#xff0c;除了根结点和叶子结点之外的叫决策结点(decision node)&#xff0c;最底层的叫叶子结点(leaf node)&#xff0c…

PHP反序列化--_wakeup()绕过

一、漏洞原理&#xff1a; 二、靶场复现: 进入靶场&#xff0c;分析源代码&#xff1a; <?php error_reporting(0); class secret{var $fileindex.php;public function __construct($file){$this->file$file;}function __destruct(){include_once($this->file);ech…

2024年3月GESP认证Scratch图形化编程四级真题及答案

GESP 图形化四级试卷 &#xff08;满分&#xff1a;100 分 考试时间&#xff1a;120 分钟&#xff09; 学校&#xff1a; 姓名&#xff1a; ​ 一、单选题&#xff08;共 10 题&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 题号 1 2 3 4 5 6 7 8 9 10 11 1…

外包干了5天,技术退步明显。。。。

说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&a…

十九、软考-系统架构设计师笔记-真题解析-2021年真题

软考-系统架构设计师-2021年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.前趋图(Precedence Graph)是一个有向无环图&#xff0c;记为&#xff1a;→(Pi,Pj)Pi must Complete Before Pj may strat), 假设系统中进程P{P1, P2,P3,P4, P5, P6, P7, P8}&#xff0c; 且进程的…