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

news2025/2/26 18:38:15

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.coloradmin.cn/o/1528650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mozilla ctypes用法了解

参考文档&#xff1a;ctypeshttp://udn.realityripple.com/docs/Mozilla/js-ctypes/js-ctypes_reference/ctypes 一、引用 ctypes.jsm方法 Components.utils.import("resource://gre/modules/ctypes.jsm") 二、用法 已知用法1&#xff1a; 结构体的声明ctypes.S…

英特尔生态的深度学习科研环境配置-A770为例

之前发过在Intel A770 GPU安装oneAPI的教程&#xff0c;但那个方法是用于WSL上。总所周知&#xff0c;在WSL使用显卡会有性能损失的。而当初买这台机器的时候我不在场&#xff0c;所以我这几天刚好有空把机器给重装成Ubuntu了。本篇不限于安装oneAPI&#xff0c;因为在英特尔的…

nginx 报Too many open files

nginx 异常报 Too many open files 上周时&#xff0c;nginx已经报 Too many open files 当时把 配置文件调整最大连接65535了&#xff0c;reload 重新加载nginx后不报错了。 cat /proc/14921/limits |grep "Max open file" * soft nofile 65535 * hard nof…

【01】htmlcssgit网络基础知识

一、html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全透明,1…

vue2(vue3也可以使用)移动端h5网页实现扫一扫功能

一、效果 可以看调起了我们的摄像头&#xff0c;点击允许过后就打开了扫码界面 二、实现过程 1.安装包 zxing/library 2.构建页面 <template><div class"scan"><div class"video-container"><div class"scan-box">&…

图论03-所有可能路径(Java)

3.所有可能路径 题目描述 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到…

TypeScript(六)条件类型,函数,装饰器

条件类型 TypeScript 中的条件类型是一种高级类型&#xff0c;它使我们根据不同的条件创建更复杂的类型。 TS中的条件类型就是在类型中添加条件分支&#xff0c;以支持更加灵活的泛型 条件类型允许我们根据某个类型的属性是否满足某个条件&#xff0c;来确定最终的类型。 type…

【海贼王的数据航海】排序——冒泡|快速|归并排序|总结

目录 1 -> 交换排序 1.1 -> 冒泡排序 1.1.1 -> 代码实现 1.2 -> 快速排序 1.2.1 -> hoare版本 1.2.2 -> 挖坑法 1.2.3 -> 前后指针法 1.2.4 -> 快速排序(递归版) 1.2.5 -> 快速排序(非递归版) 2 -> 归并排序 2.1 -> 归并排序 2.…

泛微 OA - 根据流程 requestid 获取流程中的附件

泛微 OA - 根据流程 requestid 获取流程中的附件 在泛微 OA 流程中&#xff0c;附件是通过加密上传的&#xff0c;如果在第三方系统想要调用 OA 系统获取 OA 附件&#xff0c;暂时没有很好的方法实现。但是可以在本地进行调用&#xff0c;得到附件 url 地址、附件 id、附件上传…

蓝桥杯练习02随机数生成器

随机数生成器 介绍 实际工作中随机数的使用特别多&#xff0c;比如随机抽奖、随机翻牌。通过随机数还能实现很多有趣的效果&#xff0c;比如随机改变元素的位置或颜色。 本题需要在已提供的基础项目中使用JS知识封装一个函数&#xff0c;该函数可以根据需要&#xff0c;生成指…

01. 【Android教程】系统背景及结构概述

1. Android 的历史 Android 一词的本意指“人形机器人”&#xff0c;安迪•鲁宾 (Andy Rubin) 在 2003 年以此名创办了 Android 公司并开始召集团队研发 Android 系统。后于 2005 年被 Google 收购&#xff0c;安迪•鲁宾随后任 Google 工程部副总裁&#xff0c;继续负责 Andr…

数据可信流通:从运维信任到技术信任

1.数据可信流通概念 "数据可信流通"通常指的是确保数据在不同系统、应用程序或者组织之间的传输和交换过程中的可信性、完整性和安全性。在数据流通的过程中&#xff0c;确保数据的真实性、完整性和保密性是非常重要的&#xff0c;尤其是涉及到敏感信息或者重要数据…

大数据开发--01.初步认识了解

一.环境准备 1.使用虚拟机构建至少三台linux服务器 2.使用公有云来部署服务器 二.大数据相关概念 大数据是指处理和分析大规模数据集的一系列技术、工具和方法。这些数据集通常涉及海量的数据&#xff0c;包括结构化数据&#xff08;如关系型数据库中的表格&#xff09;以及…

Verdaccio部署及基础使用

1. Verdaccio 简介 Verdaccio&#xff0c;是一个轻量级的 npm 私有仓库的开源解决方案。npm是一个基于http的协议&#xff0c;用来存放软件包并且维护版本和依赖&#xff0c;利用 http 提供的 url路径 来对软件包进行增删改查。所以 Verdaccio 这款软件的核心就是实现 npm协议…

机器人路径规划:基于双向A*算法(bidirectional a star)的机器人路径规划(提供Python代码)

一、双向A*算法简介 传统A*算法是一种静态路网中求解最短路径最有效的方法&#xff0c; 它结合了BFS 算法和迪杰斯特拉算法(Dijkstra)的优点。 和迪杰斯特拉算法(Dijkstra)一样&#xff0c; A*算法能够用于 搜索最短路径&#xff1b; 和BFS 算法一样&#xff0c; A*算法可以用…

从头手搓一台ros2复合机器人(带机械臂)

一.前言 大家好呀&#xff0c;从本小节开始我们就步入了仿真篇&#xff0c;主要对机器人仿真进行介绍与操作&#xff0c;当然仿真有优点也有缺陷&#xff0c;基于对此学习&#xff0c;我们可以对上几小节创建的小车模型模拟硬件的特性&#xff0c; 比如&#xff1a; 有多重…

打开磁盘清理工具的9种方法,总有一种适合你

前言 你可以在Windows 10和11上使用许多第三方磁盘清理工具来进行清理。但是,别忘了Windows包含自己的磁盘清理工具,你可以使用该工具释放硬盘存储空间。一些第三方替代方案可能有更广泛的清理选项和功能,但磁盘清理仍然是消除多余文件的完美工具。 每个用户都应该不时地进…

vue 部署 abap BSP

How to Create a Vue.Js App with VS Code and Deploy... - SAP Community 详情见上面这个教程连接 Open VS Code and open a terminal window and run npm install -g vue/cli restart vscode. Open a terminal window again and go to your workspace folder to create the…

使用echart绘制拓扑图,树类型,自定义tooltip和label样式,可收缩

效果如图&#xff1a; 鼠标移上显示 vue3 - ts文件 “echarts”: “^5.4.3”, import { EChartsOption } from echarts import * as echarts from echarts/core import { TooltipComponent } from echarts/components import { TreeChart } from echarts/charts import { C…

VR历史建筑漫游介绍|虚拟现实体验店|VR设备购买

VR历史建筑漫游是一种利用虚拟现实技术&#xff0c;让用户可以身临其境地参观和探索历史建筑的体验。通过VR头显和相关设备&#xff0c;用户可以在虚拟环境中自由移动和互动&#xff0c;感受历史建筑的真实氛围和文化内涵。 在VR历史建筑漫游中&#xff0c;您可以选择不同的历史…