代码随想录算法训练营 Day25|回溯算法2

216.组合总和III

思路

按照回溯算法的逻辑,写代码。
递归函数的参数,除了原有的n, k, startIndex,增加一个sum,计算当前path中的和。
终止条件用sum与n比较,如果满足相等,且满足长度为k,则加入result。

尝试写代码:

class Solution:def __init__(self):self.path = []self.result = []def combinationSum3(self, k: int, n: int) -> List[List[int]]:self.backtracking(k, n, 1, 0)return self.resultdef backtracking(self, k, n, startIndex, sum):if sum == n:if len(self.path) == k:self.result.append(self.path[:])sum = 0returnelif sum > n:returnfor i in range(startIndex, 10):if sum < n:self.path.append(i)sum += iself.backtracking(k, n, i + 1, sum)self.path.pop()sum -= i

成功通过!
但是对于终止条件那里还是有点模糊,不知道为什么两个if要嵌套着,不能and连接。
糊里糊涂的过了

根据代码随想录
终止条件,先判断path长度是否为k,如果不满足,返回;在此条件下,再判断当前的sum是否等于n。

剪枝1:
放在终止条件:如果当前sum比n大,则直接返回
剪枝2:
要求共有k个数,如果后面要取的数不够了,剪枝。
该剪枝放在for循环的条件里,写为9 - (k - path.size) + 1

最终代码

class Solution:def __init__(self):self.path = []self.result = []def combinationSum3(self, k: int, n: int) -> List[List[int]]:self.backtracking(k, n, 1, 0)return self.resultdef backtracking(self, k, n, startIndex, sum):if sum > n:returnif len(self.path) == k:if sum == n:self.result.append(self.path[:])returnfor i in range(startIndex, 9 - (k - len(self.path)) + 2):self.path.append(i)sum += iself.backtracking(k, n, i + 1, sum)self.path.pop()sum -= i

总结
终止条件最基本的是长度是否与题目要求的相等,在此基础上再去判断和是否相等。
这样就不需要在for循环内增加条件,因为只要path的长度到k,都会返回,只不过如果再满足sum=n的话,就将当前的path加入result。
如此的整体结构就会很清晰

17.电话号码的字母组合

思路

有点不知道怎么弄
这里每个数字中都能挑选自己的字母,因此不存在startIndex。
先按照流程,递归函数的终止条件,如果是之前的题,需要判断path的长度,
但是由于7和9中有四个数字,而其他有三个数字,这里的for循环的范围不知道该如何确定
for循环就直接从digits中取数
问题
不知道如何将数组和各自的字母联系起来,可以尝试用字典,但具体不确定怎么写

根据代码随想录
要点:

  1. 用数组做一个映射,将数组的下标与内容对应
  2. 用二叉树画图,抽象理解,树的深度取决于输入的数的个数
  3. 函数参数中有一个index,不同于之前的startIndex,index表示当前递归到了第几个数字。因为之前的题是在一个集合中组合,本题是在两个集合中组合,因此不需要startIndex确定集合中之前遍历过哪些元素
  4. 终止条件:用index判断是否遍历到了digits.size。然后收获结果,返回。这里不同于之前用path.size。不过我觉得用path.size也可以
  5. 取出一个数,通过数组映射得到这个数对应的字母
  6. for循环的范围通过上面得到的数字对应的字母的size决定
  7. 递归时,index + 1,使得下次递归时,取下一个数

尝试写代码:

class Solution:def __init__(self):self.path = ''self.result = []self.letterMap = ['',      # 0'',      # 1'abc',   # 2'def',   # 3'ghi',   # 4'jkl',   # 5'mno',   # 6'pqrs',  # 7'tuv',   # 8'wxyz'   # 9]def letterCombinations(self, digits: str) -> List[str]:self.backtracking(digits, 0)return self.resultdef backtracking(self, digits, index):if len(self.path) == len(digits):self.result.append(self.path)returndigit = int(digits[index])letter = self.letterMap[digit]for i in range(len(letter)):self.path += letter[i]self.backtracking(digits, index + 1)self.path = self.path[:-1]

有的通过,有的不对
如果给的digits为空,应该输出空列表,但是result有一个空引号

根据代码随想录:在给定函数开头加个if判断

最终代码

class Solution:def __init__(self):self.path = ''self.result = []self.letterMap = ['',      # 0'',      # 1'abc',   # 2'def',   # 3'ghi',   # 4'jkl',   # 5'mno',   # 6'pqrs',  # 7'tuv',   # 8'wxyz'   # 9]def letterCombinations(self, digits: str) -> List[str]:if len(digits) == 0:return self.resultself.backtracking(digits, 0)return self.resultdef backtracking(self, digits, index):if index == len(digits):self.result.append(self.path)returndigit = int(digits[index])letter = self.letterMap[digit]for i in range(len(letter)):self.path += letter[i]self.backtracking(digits, index + 1)self.path = self.path[:-1]

Python方法

使用切片的方式来删除字符串的最后几个字符:
删除最后两个字符:s = s[:-2]
删除最后一个字符:s = s[:-1]
s[:-1]的意思就是s字符串取从第0个字符至倒数第一个字符的前一个字符,这样就达到了去掉最后一个字符的目的。

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

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

相关文章

WPF-后台设置控件Background

有时候需要在后台设置控件的背景 方法1&#xff1a; Btn_SendNeedle_Admin.Content "送针结束"; Btn_SendNeedle_Admin.Background new SolidColorBrush((Media.Color)Media.ColorConverter.ConvertFromString("#AAFFFFFF")); 方法2&#xff1a; Btn…

SqlServer2008(R2)(一)SqlServer2008(R2)经典宝藏操作收集整理

一、常见操作 1、TRUNCATE TABLE 语句 删除表数据 TRUNCATE TABLE语句比DELET删除表中的所有行更快。从逻辑上讲&#xff0c;TRUNCATE TABLE它类似于DELETE没有WHERE子句的语句。 TRUNCATE TABLE语句从表中删除所有行&#xff0c;但表结构及其列&#xff0c;约束&#xff0c;…

JSON 配置文件

JSON 配置文件的作用 JSON 是一种数据格式&#xff0c;在实际开发中&#xff0c; JSON 总是以配置文件的形式出现。小程序项目中也不例外&#xff1a;通过不同的 .json 配置文件&#xff0c;可以对小程序项目进行不同级别的配置。 小程序项目中有 4 种 json 配置文件&#xff0…

1.AD域控如何强制删除不可以用域控服务器

(1)原因需求 (2)不可用的域控不删掉造成的问题 (3)实战配置步骤 第一步:连接登录到特定服务器 第二步:选择要删除域控所在的站点和名称 第三步:执行删除命令

Ubuntu 20.04 系统如何优雅地安装NCL?

一、什么是NCL&#xff1f; NCAR Command Language&#xff08;NCL&#xff09;是由美国大气研究中心&#xff08;NCAR&#xff09;推出的一款用于科学数据计算和可视化的免费软件。 它有着非常强大的文件输入和输出功能&#xff0c;可读写netCDF-3、netCDF-4 classic、HDF4、b…

Elasticsearch快速检索的法宝: 倒排索引

倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎和信息检索系统中的一个关键数据结构&#xff0c;它允许快速进行全文搜索。在倒排索引中&#xff0c;文档的内容被分析并分割成一系列的词条&#xff08;tokens&#xff09;&#xff0c;然后每个词条被映射到包含它的…

3048. 标记所有下标的最早秒数 I(补题 ,二分 正序 逆序)

3048. 标记所有下标的最早秒数 I 给你两个下标从 1 开始的整数数组 nums 和 changeIndices &#xff0c;数组的长度分别为 n 和 m 。 一开始&#xff0c;nums 中所有下标都是未标记的&#xff0c;你的任务是标记 nums 中 所有 下标。 从第 1 秒到第 m 秒&#xff08;包括 第…

Xinstall助力web唤起iOS,打破平台壁垒,实现无缝跳转

在移动互联网时代&#xff0c;web与App之间的跳转已成为用户日常使用中不可或缺的一部分。然而&#xff0c;对于iOS系统的用户来说&#xff0c;web唤起App的过程往往充满了挑战和不便。这时&#xff0c;Xinstall作为一款专业的移动开发者服务工具&#xff0c;为开发者们提供了解…

在taro开发小程序中,创建全局事件,更新各个tabbar页面数据,适用购物车更新,taro购物车数据同步

在 Taro 小程序开发中实现一个全局的订阅发布机制&#xff0c;可以让你在任何一个 TabBar 页面修改数据时&#xff0c;通知其他 TabBar 页面更新数据。这种机制可以通过自定义事件的方式来实现 步骤 1&#xff1a;创建全局事件管理器 首先&#xff0c;在你的小程序中创建一个…

Lua中文语言编程源码-第一节,更改llex.c词法分析器模块, 使Lua支持中文关键词。

源码已经更新在CSDN的码库里&#xff1a; git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的llex.c&#xff0c;是Lua的词法分析器模块。 增加中文保留字标识符列表&#xff0c;保留英文保留字标识符列表。 搜索“ORDER RESERVED”&#xff0c;将原始代码 …

微信小程序开发学习笔记——3.10【小案例】表单提交样式布局与model双向绑定

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;3.10.【小案例】表单提交样式布局与model双向绑定_哔哩哔哩_bilibili 一、model简易双向绑定 简单双向绑定语法查阅&#xff1a;小程序框架 / 视图层 /…

ARM和AMD介绍

一、介绍 ARM 和 AMD 都是计算机领域中的知名公司&#xff0c;它们在不同方面具有重要的影响和地位。 ARM&#xff08;Advanced RISC Machine&#xff09;&#xff1a;ARM 公司是一家总部位于英国的公司&#xff0c;专注于设计低功耗、高性能的处理器架构。ARM 架构以其精简指…

如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 前一篇&#xff1a;OpenCV4.9.0在windows系统下的安装 后一篇&#xff1a; 警告&#xff1a; 本教程可以包含过时的信息。 我在这里描述的所有内容都将适用于 OpenCV 的C\C接口。我首先假…

图像处理ASIC设计方法 笔记10 插值算法的流水线架构

&#xff08;一&#xff09; 三次插值算法实现的图像旋转设计的流水线架构 传统上&#xff0c;三次插值算法实现的图像旋转设计需要三块一样的处理资源&#xff0c;为了节约资源&#xff0c;采用流水线设计&#xff0c;简单来讲就是三次插值算法共用一块资源&#xff0c;优化这…

Hive Sql获取含有特殊字符key的json数据

hive表中json数据的key含有.符号&#xff0c;所以使用get_json_object(str,“$.key_1.key_2”)语法的时候就会获取到null。解法是通过json_to_map方法将json数据变成一个map结果&#xff0c;然后用key下标的方式获取值&#xff0c;代码 json_to_map(str)["key_1.key_2]

mysql报错日志查看

路径命令 在MySQL命令行客户端中&#xff0c;执行SHOW VARIABLES LIKE log_error;这个命令可以显示log_error系统变量的值&#xff0c;这个值通常指向MySQL的错误日志文件&#xff08;error log&#xff09;的路径。通过这个命令&#xff0c;你可以快速找到MySQL的报错日志文件…

数据结构的概念大合集02(线性表)

概念大合集02 1、线性表及其逻辑结构1.1 线性表的定义1.2 线性表的基本操作 2、线性表的顺序存储结构2.1 顺序表 3、线性表的链式存储3.1 链表3.1.1 头结点&#xff08;头指针&#xff09;&#xff0c;首指针&#xff0c;尾指针&#xff0c;尾结点3.1.2 单链表3.1.3 双链表3.1.…

软件供应链投毒 — NPM 恶意组件分析(二)

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 专栏供应链安全 数字化时代&#xff0c;软件无处不在。软件如同社会中的“虚拟人”&#xff0c;已经成为支撑社会正常运转的最基本元素之一&#xff0c;软件的安全性问题也正在成为当今社会的根本性、基础性问题。 随…

瑞熙贝通实验室安全培训考试系统

一、系统概述 瑞熙贝通实验室安全培训考试系统是一种基于互联网和人工智能技术的在线考试平台&#xff0c;旨在旨在提供实验室安全教育和考核的全面解决方案。该系统可以帮助实现实验室安全培训考试的在线化、智能化和规范化&#xff0c;提高实验室安全意识和能力&#xff0c;…

IntelliJ IDEA 面试题及答案整理,最新面试题

IntelliJ IDEA中的插件系统如何工作&#xff1f; IntelliJ IDEA的插件系统工作原理如下&#xff1a; 1、插件架构&#xff1a; IntelliJ IDEA通过插件架构扩展其功能&#xff0c;插件可以添加新的功能或修改现有功能。 2、安装和管理&#xff1a; 通过IDEA内置的插件市场下载…