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

一、|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~9path.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.rhkb.cn/news/180076.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用ps制作ico图标文件

如何使用ps制作ico图标文件 Chapter1 如何使用ps制作ico图标文件Chapter2 ICOFormat.8bi&#xff08;Photoshop Ico、Cur插件&#xff09;的下载使用1. ICOFormat.8bi的作用2. ICOFormat.8bi使用 Chapter3 ps手机计算机图标教程,手绘设计精美手机APP软件图标的PS教程步骤 01 制…

吴恩达《机器学习》4-6->4-7:正规方程

一、正规方程基本思想 正规方程是一种通过数学推导来求解线性回归参数的方法&#xff0c;它通过最小化代价函数来找到最优参数。 代价函数 J(θ) 用于度量模型预测值与实际值之间的误差&#xff0c;通常采用均方误差。 二、步骤 准备数据集&#xff0c;包括特征矩阵 X 和目标…

使用JMeter进行接口压力测试

1.我首先创建一个线程组 2.创建好之后如图所示 3. 进行配置 4. 然后添加一个https请求 5.创建好之后设置请求方法和对应参数 6.设置表格监听器 7.创建好之后如图所示 8.保存jmx文件后点击运行进行测试&#xff0c;结果反馈如下图

IIS中间件漏洞----DotNetScan 工具

用DotNetScan 工具把目标网站IP&#xff0c;端口填写下。找到IIS的网站后就可进行操作上传。 也可以使用IISPutScanner工具 上传文件 利用解析漏洞 利用漏洞的前提条件&#xff1a;网站根目录可写入

「图像 cv2.seamlessClone」无中生有制造数据

上一篇博客【「图像 merge」无中生有制造数据 】写的是图片直接融合&#xff0c;此方法生成的图片相对而言比较生硬&#xff0c;虽然目标图片已经透明化处理过了&#xff0c;但是生成的图片依旧很假 除了上述上述的图片叠加融合之外&#xff0c;还有一种更加自然的融合方法&…

Leetcode—100.相同的树【简单】

2023每日刷题&#xff08;十八&#xff09; Leetcode—100.相同的树 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSameTree(struct TreeNode* p, struc…

基于STM32设计的室内环境监测系统(华为云IOT)_2023

一、设计需求 基于STM32+华为云物联网平台设计一个室内环境监测系统,以STM32系列单片机为主控器件,采集室内温湿度、空气质量、光照强度等环境参数,将采集的数据结果在本地通过LCD屏幕显示,同时上传到华为云平台并将上传的数据在Android移动端能够实时显示、查看。 【1…

【el-cascader-panel】组件el-cascader-panel使用踩坑

需求背景&#xff1a;角色管理资源&#xff0c;资源返回树形结构数据&#xff0c;左侧树形展示列表可查询&#xff0c;右侧勾选资源权限平铺。 本身组件不支持全选&#xff0c;所以增加了全选按钮。覆写了级联面板宽度。可传只勾选code或者顺序当前节点二维数组列表。 效果 因…

Portraiture4.1.2最新中文汉化版

提起PS后期修图人像美白磨皮&#xff0c;大家会想到各种磨皮工具&#xff0c;其中Portraiture这款磨皮效率超高&#xff0c;是99%摄影师的必备插件&#xff0c;一秒磨皮&#xff0c;无卡顿&#xff0c;效果好&#xff01;人像摄影师人均一款&#xff0c;磨皮质感非常好&#xf…

groovy下载与安装

Groovy是一种基于JVM&#xff08;Java虚拟机&#xff09;的敏捷开发语言&#xff0c;它结合了Python、Ruby和Smalltalk的许多强大的特性&#xff0c;Groovy 代码能够与 Java 代码很好地结合&#xff0c;也能用于扩展现有代码。由于其运行在 JVM 上的特性&#xff0c;Groovy也可…

降低存储网络55% 延迟!阿里云存储论文入选计算机顶会

近日&#xff0c;计算机系统领域的国际顶级学术会议USENIX ATC 2023在美国波士顿市举行。凭借在规模化部署和应用模型上的创新&#xff0c;阿里云存储团队发表的技术论文《Deploying User-space TCP at Cloud Scale with LUNA》被顶会收录&#xff0c;这是继NSDI 21、SIGCOMM 2…

【Linux】基础IO之文件操作(文件fd)——针对被打开的文件

系列文章目录 文章目录 系列文章目录前言浅谈文件的共识 一、 回忆c语言对文件操作的接口1.fopen接口和cwd路径2.fwrite接口和"w"&#xff0c;"a"方法3.fprintf接口和三个默认打开的输入输出流&#xff08;文件&#xff09; 二、过渡到系统&#xff0c;认识…

短视频矩阵营销系统工具如何助力商家企业获客?

1.批量剪辑技术研发 做的数学建模算法&#xff0c;数学阶乘的组合乘组形式&#xff0c;采用两套查重机制&#xff0c;一套针对素材进行查重抽帧素材&#xff0c;一套针对成片进行抽帧素材打分制度查重&#xff0c;自动滤重计入打分。 2.账号矩阵分发开发 多平台&#xff0c;…

React Hooks的使用

目录 1.React Hooks使用注意事项 1.useState Hook&#xff1a; 2.useEffect Hook&#xff1a; 3.其他常用Hooks&#xff1a; 2.使用React Hooks需要遵循 1.安装React&#xff1a; 2.导入所需的Hooks&#xff1a; 3.使用Hooks创建组件&#xff1a; 4.在应用中使用组件&…

el-popover触发元素位置改变后更新弹出框的偏移位置

el-popover的使用如下&#xff1a;包含一个触发元素和一个弹出框元素 但是如果触发元素位置发生变化时&#xff0c;如根据弹框选择内容&#xff0c;会显示或隐藏对应的元素&#xff0c;从而导致弹出框触发元素的位置的变化&#xff0c;此时触发元素位置变化了&#xff0c;但是…

[C++]关键字,类与对象等——喵喵要吃C嘎嘎2

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

MATLAB颜色索引表---持续更新中--各个平台都可使用

MATLAB颜色索引表—持续更新中–各个平台都可使用

XCTF-RSA-2:baigeiRSA2、 cr4-poor-rsa

baigeiRSA2 题目描述 import libnum from Crypto.Util import number from functools import reduce from secret import flagn 5 size 64 while True:ps [number.getPrime(size) for _ in range(n)]if len(set(ps)) n:breake 65537 n reduce(lambda x, y: x*y, ps) m …

CentOS、linux安装squid搭建正向代理,window11配置正向代理

1.CentOS安装配置squid 1.1.安装 yum install -y squid1.2.修改配置文件 在配置文件添加以下2行代码 acl localnet src 0.0.0.0/0.0.0.0 # add by lishuoboy http_access allow all # add by lishuoboy1.3.启动squid systemctl restart squid2.win11…

Jmeter只能做性能测试吗?

Jmeter除了可以性能测试&#xff0c;还能做接口测试 1、Jmeter和Fiddler&#xff0c;Postman有什么区别? Fiddler&#xff1a;虽然有接口测试功能&#xff0c;很少用来做接口测试。 一般用Fiddle来做抓包和异常测试&#xff0c;辅助接口测试。Postman&#xff1a; 是接口调试…