LeetCode算法题解(回溯)|LeetCode216. 组合总和 III、LeetCode17. 电话号码的字母组合

news2024/11/25 18:59:42

一、|LeetCode216. 组合总和 III

题目链接:216. 组合总和 III

题目描述:

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

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

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

示例 2:

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

示例 3:

输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

提示:

  • 2 <= k <= 9
  • 1 <= n <= 60

算法分析:

利用回溯算法,首先创建一个二维数组来存放所有合理组合的结果集,用一个一维数组来搜索所有组合。

然后通过递归来纵向遍历组合里的每个元素。

递归参数:每个元素开始的位置坐标startInt,组合中的所有元素总和。

递归结束条件:如果组合的长度等于规定长度K,无论组合总和是否等于N都要返回。

然后用for循环横向遍历从startInt开始到9,

每层for循环,将对应元素i插入组合,同时总和sum也要加上i,然后递归下一层。

递归之后就是回溯,要将当前的元素i从组合中拿出来,sum也要减掉i,再进行下一层for循环。

代码如下:

class Solution {
    List<List<Integer>>result = new ArrayList<>();//用来存放所有组合的结果集
    LinkedList<Integer>path = new LinkedList<>();//用来寻找每种合理组合
    int K;
    int N;
    public void backTraving(int startInt, int sum) {//递归纵向遍历组合的每个元素
        if(path.size() == K) {//如果组合长度等于K,无论组合总和是否等于n都要推出递归
            if(sum == N) result.add(new LinkedList(path));//如果组合总和等于n就将组合放入结果集然后返回
            return;
        }
        for(int i = startInt; i <=9; i++) {//for循环横向遍历1~9
            path.add(i);
            sum += i;
            backTraving(i + 1, sum);//递归
            //回溯
            sum -= i;
            path.removeLast();
        }
    }
    public List<List<Integer>> combinationSum3(int k, int n) {
        K = k;
        N = n;
        backTraving(1, 0);
        return result;
    }
}

二、LeetCode17. 电话号码的字母组合

题目链接:17. 电话号码的字母组合

题目描述:

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

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

示例 1:

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

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

算法分析:

利用回溯算法。

递归纵向遍历字符串digits的每个数字字符。

传递参数:当前组合的长度;

递归结束条件:如果当前组合长度等于digits的长度,将组合放入结果集然后返回。

然后横向遍历每个数字字符所映射的每个字符,将字符依次插入组合,后递归,再删除。

代码如下:

class Solution {
    List<String>result = new ArrayList<String>();//用来存放结果集
    StringBuilder path = new StringBuilder();//用来搜索所有组合
    int len;//字符串长度
    public void backTraving(String digits, int index) {//递归纵向遍历字符串每个数字字符
        if(index == len) {
            result.add(path.toString());
            return;
        }
        switch(digits.charAt(index)) {//横向遍历每个字符所映射的字符,然后递归回溯
            case '2':
                {
                    path.append('a');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('b');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('c');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    break;
                }
            case '3':
            {
                    path.append('d');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('e');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('f');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    break;
                }
            case '4':
            {
                    path.append('g');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('h');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('i');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    break;
                }
            case '5':
            {
                    path.append('j');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('k');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('l');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    break;
                }
            case '6':
            {
                    path.append('m');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('n');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('o');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    break;
                }
            case '7':
            {
                    path.append('p');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('q');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('r');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('s');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    break;
                }
            case '8':
            {
                    path.append('t');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('u');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('v');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    break;
                }
            case '9':
            {
                    path.append('w');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('x');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('y');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    path.append('z');
                    backTraving(digits, index + 1);
                    path.deleteCharAt(index);
                    break;
                }
            default:
                break;
        }
    }
    public List<String> letterCombinations(String digits) {
        len = digits.length();
        if(len == 0) return result;
        backTraving(digits, 0);
        return result;
    }
}

总结

只要掌握了回溯的真正用法并不是很难!

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

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

相关文章

【小白专用】微信小程序个人中心、我的界面(示例一)23.11.04

微信小程序使用button按钮实现个人中心、我的界面&#xff08;示例一&#xff09; 微信小程序个人中心、我的界面&#xff0c;使用button按钮实现界面布局&#xff0c;更好的将分享好友、获取头像等功能展现出来&#xff0c;更多示例界面&#xff0c;请前往我的主页哦。 1、js…

电子凭证会计数据标准试点深化后,企业管理的关键点在于什么?

为了加快建设数字中国、发展数字经济发展&#xff0c;并推动经济社会绿色化、低碳化发展&#xff0c;政府部门一直大力推动企业的数字化转型。 企业的经营活动也越来越活跃。企业在经营中产生了大量的票据&#xff0c;由于电子凭证分属不同的部门管理&#xff0c;数据不兼容&am…

黔院长 | 贵州四部门联合发文加强新时代中医药人才工作!

近日&#xff0c;贵州省中医药管理局、省教育厅、省人力资源社会保障厅和省卫生健康委联合印发《关于加强新时代中医药人才工作的实施意见》&#xff0c;《意见》强调培训”能中会西“的基层医生&#xff01; 《意见》提出&#xff0c;要加强中医药高层次人才队伍建设&#xff…

Day19力扣打卡

打卡记录 填充每个节点的下一个右侧节点指针 II&#xff08;BFS层序遍历&#xff09; 链接 采用BFS层序遍历&#xff0c;将每一层的节点遍历之后存入数组中&#xff0c;再对数组中一层中的所有节点遍历来进行next连接&#xff0c;再同时更新下一层的所有节点到数组当中。 /*…

如何在知识付费系统小程序开发中实现社区互动和用户参与

在知识付费系统小程序的开发中&#xff0c;实现社区互动和用户参与可以通过以下步骤实现&#xff1a; 1. 建立用户身份验证和管理系统 // 后端示例代码&#xff08;Node.js&#xff09; // 用户注册 app.post(/register, (req, res) > {const { username, email, passwor…

前端性能分析工具

前段时间在工作中,需要判断模块bundle size缩减对页面的哪些性能产生了影响, 因此需要了解前端的性能指标如何定义的,以及前端有哪些性能分析工具, 于是顺便整理了一篇笔记, 以供前端小白对性能这块知识点做一个入门级的了解. 页面渲染 在了解性能指标和分析工具之前,有必要先…

软件开发项目文档系列之十如何撰写测试用例

目录 1 概述1.1 编写目的1.2 定义1.3 使用范围1.4 参考资料1.5 术语定义 2 测试用例2.1 功能测试2.1.1 用户登录功能2.1.2 商品搜索功能 2.2 性能测试2.2.1 网站响应时间2.2.2 并发用户测试 附件&#xff1a; 测试用例撰写的要素和注意事项附件1 测试用例要素附件2 测试用例的注…

IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】

Docker官网 Docker官网&#xff1a;https://www.docker.com/ Docker Hub官网&#xff1a;http://hub.docker.com/ 什么是Docker Docker 是一个开源的容器引擎&#xff0c;可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者和系统管理员在笔记本上编…

ATFX汇市:英国央行维持基准利率不变,至此“美欧英”三大央行均宣布暂停加息

ATFX汇市&#xff1a;英国央行11月份利率决议上&#xff0c;货币政策委员会以 6 票对 3 票的多数投票决定将银行利率维持在 5.25%&#xff0c;原因在于&#xff0c;央行认为英国 GDP 在 2023 年第三季度将持平&#xff0c;弱于 8 月报告中的预测&#xff0c;另外&#xff0c;一…

windows11本地安装部署langchain-chatchat api接口报错

Langchain-chatchat 提示&#xff1a;Langchain服务已经正常启动&#xff0c;swagger-ui页面也正常访问的情况下出现接口调试报错问题 文章目录 Langchain-chatchat前言问题分析解决问题方案 前言 报错接口如下&#xff1a; 2023-11-03 15:23:50 | INFO | stdout | INFO: …

macOS 下 starUML 软件激活方案

starUML每次打开都弹出提示其实挺烦的&#xff0c;于是研究了一下如何 po 解(激活)它。记录一下方法以便以后使用。 我觉得这个软件很好用&#xff0c;大型项目的所有图我都是用这个软件画的。 直接上步骤&#xff01;先关掉starUML 1、安装 asar&#xff0c;以便可以打开 asa…

数据湖Iceberg介绍和使用(集成Hive、SparkSQL、FlinkSQL)

文章目录 简介概述作用特性数据存储、计算引擎插件化实时流批一体数据表演化&#xff08;Table Evolution&#xff09;模式演化&#xff08;Schema Evolution&#xff09;分区演化&#xff08;Partition Evolution&#xff09;列顺序演化&#xff08;Sort Order Evolution&…

【MySQL】索引(下)

文章目录 1. 普通索引2. 索引操作创建主键索引查询索引删除索引唯一索引的创建删除唯一键索引普通索引的创建全文索引 1. 普通索引 MySQL除了会默认建立主键索引&#xff0c;也可能会按照其他列信息建立的索引&#xff0c;一般这种索引称为 普通索引 对于 储存引擎 myisam&…

Dubbo篇---第一篇

系列文章目录 文章目录 系列文章目录一、说说一次 Dubbo 服务请求流程?二、说说 Dubbo 工作原理三、Dubbo 支持哪些协议?一、说说一次 Dubbo 服务请求流程? 基本工作流程: 上图中角色说明: 二、说说 Dubbo 工作原理 工作原理分 10 层: 第一层:service 层,接口层,…

棱镜七彩兼容CCF版开源漏洞信息描述规范COSV Schema 1.0

CCF版开源漏洞信息描述规范COSV Schema 1.0&#xff08;以下简称“COSV Schema1.0”&#xff09;已于前期正式发布&#xff0c;棱镜七彩作为COSV Schema 1.0制定工作的重要成员积极响应规范内容&#xff0c;目前公司产品与漏洞推送服务已经实现COSV Schema 1.0兼容。 开源软件…

关于Linux下排查C++进程Segment fault问题的步骤

C 中出现Segment问题的常见原因有: 如果要定位Segment fault问题&#xff0c;需要进行如下几步&#xff1a; gdb your_program(gdb) break main(gdb) run(gdb) backtrace同时要在CMakeLists.txt文件中配置编译时启用符号调试信息&#xff0c; 在C或者C中的设置分别如下&#x…

Web APIs——M端事件、JS插件

1、M端事件 移动端也有自己独特的地方。比如触屏事件touch&#xff08;也称触摸事件&#xff09;&#xff0c;Android 和 IOS都有。 触屏事件touch&#xff08;也称触摸事件&#xff09;&#xff0c;Android和IOS都有。touch对象代表一个触摸点。触摸点可能是一根手指&#xff…

ChatGLM3设置角色和工具调用的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Leetcode刷题详解——反转链表

1. 题目链接&#xff1a;206. 反转链表 2. 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1…

word文章图片怎么缩小成200kb?看这篇攻略就够了

在编辑word文档的使用&#xff0c;常常会为了增加内容的丰富性去插入一些精美图片&#xff0c;不知道小伙伴有没有发现&#xff0c;其实我们导入的图片也是有大小限制的&#xff0c;如果图片过大就无法使用的&#xff0c;那么遇到这种情况该怎么处理呢&#xff1f;其实可以把图…