代码随想录 | Day29 | 回溯算法:电话号码的字母组合组合总和

代码随想录 | Day29 | 回溯算法:电话号码的字母组合&&组合总和

关于这个章节,大家最好是对递归函数的理解要比较到位,听着b站视频课可能呢才舒服点,可以先去搜一搜关于递归函数的讲解,理解,再开始这个章节会比较好一些

我觉得回溯就是对传入递归函数的参数加加减减,加了的减掉,减了的加上

主要学习内容:

组合题目的模板

17.电话号码的字母组合

17. 电话号码的字母组合 - 力扣(LeetCode)

解法思路:

这道题其实主要的难点是要搞清楚模板里面的for循环到底在干些什么事情

20201123200304469树的每个分支其实就是每一次for循环产生的,每一层递归函数的for循环可以整整产生一层节点,比如第一层递归函数的for产生的就是要分别取a,b,c,一共循环三次,取出来三个数,所以第一层有三个节点

第二层也是类似,分别选了def,才有了ad,ae,af三个结果,所以有3*3=9个结果

而第一层的abc是数字2的集合,第二层的def是数字3的集合,所以每一层递归函数都是在遍历一个不同的数的集合,我们要做的就是让递归函数知道他这一层要遍历哪个数字的集合

1.函数参数和返回值

vector<string> res;
vector<string> s{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//0,1没有,从2开始对应
void backtracking(string str,string digits,int index)

res存放结果集,s存放数字对应的字符串

传入的参数,str相当于path,收集我们已经知道的答案

digits是题目中给的字符串,index传递本层递归函数要遍历哪个集合

2.终止条件

一个数字只选一个字母,所以只要我们收集的和题目给的字符串一样大,就是答案了

if(str.size()==digits.size())
{res.push_back(str);return;
}

3.本层代码逻辑

t表示的是我们这层递归函数选的哪个数字,是由字符串里面的数字转换过来的

s[t]对应我们选的字符串(abc还是def)

遍历自然就遍历我们选的这个字符串,从0遍历到它结束,因为它的每一个字符我们都得选一遍的

s[t][i]就是对应每个字母,我们压入字符串(这里就是把23这个例子的a压入了),然后进入下一层递归去选下一个字母(去选def里面的字母去了就)

递归的index就直接+1即可,因为我们要选的就是下一个数字对应的集合

递归结束,把刚刚压入的字母弹出(把a弹出,等i等于1压入b)

int t=(int)(digits[index]-'0');
for(int i=0;i<s[t].size();i++)
{str.push_back(s[t][i]);backtracking(str,digits,index+1);//回溯str.pop_back();
}

完整代码:

class Solution {
public:vector<string> res;vector<string> s{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};void backtracking(string str,string digits,int index){if(str.size()==digits.size()){res.push_back(str);return;}int t=(int)(digits[index]-'0');for(int i=0;i<s[t].size();i++){str.push_back(s[t][i]);backtracking(str,digits,index+1);str.pop_back();}}vector<string> letterCombinations(string digits) {if(digits.size()==0)return res;string str;backtracking(str,digits,0);return res;}
};

注:digits如果为空传个空就是。

39.组合总和

39. 组合总和 - 力扣(LeetCode)

思路:

和之前的思路差不多组合总和III,就是之前每层遍历是从i+1开始,是为了防止出现重复的数字,现在遍历从i开始,因为本身的数可以重复取

1.函数返回值和参数

vector<vector<int>> res;
void backtracking(vector<int> path,int sum,int index,vector<int> candidates,int target)

res记录结果

path收集当前组合

sum当前集合的总和

index从哪个数开始

candidates题目给的数组

target题目给的目标值

2.终止条件

当前总和已经大于target了,没必要再递归了

如果大小等于target,收集结果

if(sum>target)return;
if(sum==target)
{res.push_back(path);return;
}

3.本层逻辑

额就是可以重复取当前数字,所以下一层递归函数传参传i而不是i+1,i+1可以避免取重复的数字

不太好理解的话大家可以画个图模拟一下

for(int i=index;i<candidates.size();i++)
{path.push_back(candidates[i]);backtracking(path,sum+candidates[i],i,candidates,target);path.pop_back();
}

完整代码:

class Solution {
public:vector<vector<int>> res;void backtracking(vector<int> path,int sum,int index,vector<int> candidates,int target){if(sum>target)return;if(sum==target){res.push_back(path);return;}for(int i=index;i<candidates.size();i++){path.push_back(candidates[i]);backtracking(path,sum+candidates[i],i,candidates,target);path.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<int> path;backtracking(path,0,0,candidates,target);return res;}
};

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

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

相关文章

CSS入门

文章目录 CSS入门一、CSS概述1、概述2、CSS的作用3、初体验4、CSS基础语法4、HTML引入CSS 二、选择器 ⭐️⭐️⭐️1、基本选择器2、扩展选择器3、超链接选择器 三、样式权重问题1、权重计算规则2、权重示例3、具体示例4、 !important 四、CSS常用样式1、字体和文本属性2、背景…

2530 电力电子技术

1.晶闸管 视频链接&#xff1a;2.3半控型器件-晶闸管_哔哩哔哩_bilibili 可参考文章链接&#xff1a;电力电子技术笔记&#xff08;3&#xff09;——晶闸管_双晶体管模型正反馈-CSDN博客 半控型器件&#xff1a;门极只有在导通时有用&#xff0c;在关闭时没有用 2.Boost升压…

【C++】二叉搜索树+变身 = 红黑树

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、定义与性质二、红黑树节点的定义三、新增节点插入四、验证红黑树五、AVL树和红黑树比较 前言 本文仅适合了…

[3.4]【机器人运动学MATLAB实战分析】PUMA560机器人逆运动学MATLAB计算

PUMA560是六自由度关节型机器人,其6个关节都是转动副,属于6R型操作臂。各连杆坐标系如图1,连杆参数如表1所示。 图1 PUMA560机器人的各连杆坐标系 表1 PUMA560机器人的连杆参数 用代数法对其进行运动学反解。具体步骤如下: 1、求θ1 PMUMA56

MFC有三个选项:MFC ActiveX控件、MFC应用程序、MFC DLL,如何选择?

深耕AI&#xff1a;互联网行业 算法研发工程师 ​ 目录 MFC ActiveX 控件 控件的类型 标准控件 自定义控件 ActiveX控件 MFC ActiveX控件 标准/自定义控件 MFC ActiveX控件分类 3种MFC如何选择&#xff1f; MFC ActiveX控件 MFC 应用程序 MFC DLL 总结 举例说明…

低照度图像增强网络——EnlightenGAN

系列文章目录 GAN生成对抗网络介绍https://blog.csdn.net/m0_58941767/article/details/142704354?spm1001.2014.3001.5501 循环生成对抗网络——CycleGANhttps://blog.csdn.net/m0_58941767/article/details/142704671?spm1001.2014.3001.5501 目录 系列文章目录 前言 …

链表排序

目录 插入排序 LeetCode147 对链表进行插入排序 归并排序 LeetCode148 排序链表 插入排序 LeetCode147 对链表进行插入排序 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}…

深度学习中的优化方法(Momentum,AdaGrad,RMSProp,Adam)详解及调用

深度学习中常用的优化方法包括啦momentum(动量法),Adagrad(adaptive gradient自适应梯度法),RMSProp(root mean square propagation均方根传播算法),Adam(adaptive moment estimation自适应矩估计法) 指数加权平均算法 所谓指数加权平均算法是上述优化算法的基础,其作用是对历…

word无法复制粘贴

word无法复制粘贴 使用word时复制粘贴报错 如下&#xff1a; 报错&#xff1a;运行时错误‘53’&#xff0c;文件未找到&#xff1a;MathPage.WLL 这是mathtype导致的。 解决方法 1&#xff09;在mathtype下载目录下找到"\MathType\MathPage\64"下的"mathpa…

Python并发编程挑战与解决方案

Python并发编程挑战与解决方案 并发编程是现代软件开发中的一项核心能力&#xff0c;它允许多个任务同时运行&#xff0c;提高程序的性能和响应速度。Python因其易用性和灵活性而广受欢迎&#xff0c;但其全局解释器锁&#xff08;GIL&#xff09;以及其他特性给并发编程带来了…

python数据分析与可视化工具介绍-matplotlib库

众所周知&#xff0c;python的数据分析库主要是numpy&#xff0c;pandas&#xff0c;和matplotlib&#xff0c;而前面两个主要是数据处理工具库&#xff0c;最后一个才是真正的作图展示工具库。本节来学习一下matploatlib工具库的使用。 Matplotlib常用绘图函数 pyplot简介 m…

Oracle中TRUNC()函数详解

文章目录 前言一、TRUNC函数的语法二、主要用途三、测试用例总结 前言 在Oracle中&#xff0c;TRUNC函数用于截取或截断日期、时间或数值表达式的部分。它返回一个日期、时间或数值的截断版本&#xff0c;根据提供的格式进行截取。 一、TRUNC函数的语法 TRUNC(date) TRUNC(d…

字符编码发展史5 — UTF-16和UTF-32

上一篇《字符编码发展史4 — Unicode与UTF-8》我们讲解了Unicode字符集与UTF-8编码。本篇我们将继续讲解字符编码的第三个发展阶段中的UTF-16和UTF-32。 2.3. 第三个阶段 国际化 2.3.2. Unicode的编码方式 2.3.2.2. UTF-16 UTF-16也是一种变长编码&#xff0c;对于一个Unic…

1、如何查看电脑已经连接上的wifi的密码?

在电脑桌面右下角的如下位置&#xff1a;双击打开查看当前连接上的wifi的名字&#xff1a;ZTE-kfdGYX-5G 按一下键盘上的win R 键, 输入【cmd】 然后&#xff0c;按一下【回车】。 输入netsh wlan show profile ”wifi名称” keyclear : 输入完成后&#xff0c;按一下回车&…

浏览器前端向后端提供服务

WEB后端向浏览器前端提供服务是最常见的场景&#xff0c;前端向后端的接口发起GET或者POST请求&#xff0c;后端收到请求后执行服务器端任务进行处理&#xff0c;完成后向前端发送响应。 那浏览器前端向后端提供服务是什么鬼&#xff1f; 说来话长&#xff0c;长话短说。我在人…

AFSim仿真系统 --- 系统简解_06 平台及平台类型

平台及平台类型 在AFSIM模拟中&#xff0c;当在被模拟的场景中定义平台时&#xff0c;创建仿真实体&#xff08;如车辆和结构&#xff09;。 AFSIM是一个用于创建仿真的对象框架&#xff0c;而平台封装了对象的原则身份或定义。 平台可以拥有系统&#xff08;或平台部分&#x…

自然语言处理-语言转换

文章目录 一、语言模型二、统计语言模型1.含义与方法2.存在的问题 三、神经语言模型1.含义与方法2.one-hot编码3.词嵌入-word2vec4.模型的训练过程 四、总结 自然语言处理&#xff08;NLP&#xff09;中的语言转换方法主要涉及将一种形式的语言数据转换为另一种形式&#xff0c…

[Cocoa]_[初级]_[使用NSNotificationCenter作为目标观察者实现时需要注意的事项]

场景 在开发Cocoa程序时&#xff0c;由于界面是用Objective-C写的。无法使用C的目标观察者[1]类。如果是使用第二种方案2[2],那么也需要增加一个代理类。那么有没有更省事的办法&#xff1f; 说明 开发界面的时候&#xff0c;经常是需要在子界面里传递数据给主界面&#xff0…

Windows 搭建 Gitea

一、准备工作 1. 安装 Git&#xff1a;Gitea 依赖 Git 进行代码管理&#xff0c;所以首先需要确保系统中安装了 Git。 下载地址&#xff1a;https://git-scm.com/downloads/win 2. 安装数据库&#xff08;可选&#xff09; 默认情况下&#xff0c;Gitea 使用 SQLite 作为内…

Nginx的基础讲解之重写conf文件

一、Nginx 1、什么是nginx&#xff1f; Nginx&#xff08;engine x&#xff09;是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。 2、用于什么场景 Nginx适用于各种规模的网站和应用程序&#xff0c;特别是需要高并发处理和负载均衡的场…