代码随想录学习Day 24

93.复原IP地址

题目链接

讲解链接

本题属于切割问题,切割问题需要使用回溯算法来将所有的结果搜索出来,与前一题分割回文串是类似的。本题的树形结构如下图所示:

回溯三部曲:

1.递归函数参数及返回值:参数为待分割的字符串s,以及标记每次切割起始位置的index。

def backtracking(self, s, index):

2.递归终止条件:当index位于字符串的末尾,并且path的长度为4时,意味着终止,此时将path中的4个字符串用“.”连接起来并存入result中就得到了一个结果。

if index == len(s) and len(self.path) == 4:self.result.append('.'.join(self.path))return
if len(self.path) > 4:return

3.单层递归逻辑:在每轮循环中截取[startIndex, i]这个区间作为字串,并判断这个子串是否合法。若合法则将其加入path中,然后从i+1的位置开始下一轮递归。

for i in range(index, len(s)):if self.isvalid(s, index, i):self.path.append(s[index:i + 1])self.backtracking(s, i + 1)self.path.pop()

整体代码如下:

class Solution:def __init__(self):self.path = []self.result = []def isvalid(self, s, start, end):  # 判断是否符合IP地址的格式if start > end:return Falseif s[start] == '0' and start != end:  # 不能有前导0return Falsenum = int(s[start:end+1])if num > 255:  # 数值必须小于等于255return Falsereturn Truedef backtracking(self, s, index):if index == len(s) and len(self.path) == 4:  # 当path长度为4且index位于字符串末尾时终止self.result.append('.'.join(self.path))  # 将path中的值用“.”连接起来放入result中returnif len(self.path) > 4:  # 剪枝操作,若长度大于4则直接返回,不需要进行后续搜索returnfor i in range(index, min(index + 3, len(s))):  # min是为了剪枝,不加也可以if self.isvalid(s, index, i):self.path.append(s[index:i + 1])self.backtracking(s, i + 1)self.path.pop()def restoreIpAddresses(self, s: str) -> List[str]:self.backtracking(s, 0)return self.result

78.子集

题目链接

讲解链接

组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点。子集中集合是无序的,取过的元素不会重复取,所以写回溯算法的时候,for就要从startIndex开始,而不是从0开始。

总体思路与组合问题相差不大,主要就是要注意取的是所有节点而不仅仅是叶子节点。

回溯三部曲:

1.递归函数参数及返回值:数组nums和开始位置strartindex。

def backtracking(self, nums, startindex):

2.递归终止条件:当startindex位于数组末尾时直接返回。

if startindex == len(nums):return

 3.单层递归逻辑:与组合问题基本一致,每次递归下标从i+1开始

for i in range(startindex, len(nums)):self.path.append(nums[i])self.backtracking(nums, i + 1)self.path.pop()

整体代码如下:

class Solution:def __init__(self):self.path = []self.result = []def backtracking(self, nums, startindex):self.result.append(self.path[:])  # 每次递归时都要先收获结果if startindex == len(nums):  # 终止条件returnfor i in range(startindex, len(nums)):self.path.append(nums[i])self.backtracking(nums, i + 1)self.path.pop()def subsets(self, nums: List[int]) -> List[List[int]]:self.backtracking(nums, 0)return self.result

90.子集Ⅱ

题目链接

讲解链接

本题与上一题相比主要区别在于数组中包含重复元素,如果依旧按照原来的方法求子集最后结果中会有重复,所以需要进行去重。而且是在树层上去重而不是树枝。去重的过程则和之前做过的组合总和问题类似,可以考虑使用used数组来进行标记,也可以直接在for循环中进行判断。整体代码如下:

class Solution:def __init__(self):self.path = []self.result = []def backtracking(self, nums, startindex):self.result.append(self.path[:])  # 添加结果if startindex >= len(nums):  # 终止条件,也可以不写returnfor i in range(startindex, len(nums)):if i > startindex and nums[i] == nums[i - 1]:  # 如果i>startindex并且与前一个元素相同,那么说明这个元素已经使用过了,本轮循环直接continue即可continueself.path.append(nums[i])self.backtracking(nums, i + 1)self.path.pop()def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:nums = sorted(nums)  # 去重问题一定要先对数组进行排序self.backtracking(nums, 0)return self.result

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

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

相关文章

在 MySQL 某数据表中针对 username 字段建立唯一索引后,基于万级数据量和百万级数据量分别进行查询某用户 A,请问两次查询的性能耗时对比如何?

在 MySQL 数据库中,对 username 字段加了唯一索引后,无论数据量从 1 万增长到 100 万,只要查询条件始终是通过 username 精确查找用户 A,理论上两次查询的耗时应该保持在一个相对稳定的范围内,即查询性能大致保持一致。…

了解监控易(14):中间件监控

在当今的IT运维领域,中间件作为连接应用与底层系统的桥梁,其稳定性和性能至关重要。为了实现高效的一体化运维,各种监控工具应运而生,其中“监控易”以其强大的功能和灵活的适应性,受到了广泛关注。 监控易的核心功能之…

2012年认证杯SPSSPRO杯数学建模D题(第一阶段)人机游戏中的数学模型全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 D题 人机游戏中的数学模型 原题再现: 计算机游戏在社会和生活中享有特殊地位。游戏设计者主要考虑易学性、趣味性和界面友好性。趣味性是本质吸引力,使玩游戏者百玩不厌。网络游戏一般考虑如何搭建安全可靠、丰富多彩的…

JVM高级篇之GC

文章目录 版权声明垃圾回收器的技术演进ShenandoahShenandoah GC体验Shenandoah GC循环过程 ZGCZGC简介ZGC的版本更迭ZGC体验&使用ZGC的参数设置ZGC的调优 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马…

MySQL-相关约束

MySQL-约束 前提: 防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息。为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。有以下考虑要点: ①实体完整性(Entity In…

【C++】拆分详解 - 内存管理

文章目录 前言一、C/C内存分布二、C语言中动态内存管理方式:malloc/calloc/realloc/free三、C内存管理方式  3.1 new/delete操作内置类型  3.2 new和delete操作自定义类型  3.3 operator new与operator delete函数 四、new和delete的实现原理  4.1 内置类型…

C++中,`::`

在C中,:: 是作用域解析运算符(Scope Resolution Operator)。它有以下几种主要的作用: 访问命名空间中的成员:可以使用 :: 来访问命名空间中的变量、函数、类等成员。例如: namespace A {int x 5; }int mai…

【微服务】SpringCloud之Feign远程调用

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 🛸学无止境,不骄不躁,知行合一 文章目录 …

Solo 开发者周刊 (第10期):Sora 之后,谁是被遗忘的?谁又是被仰望的?

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿,每周五发布。在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解。本杂志开源,欢迎投稿。 好文推荐 Solo 社区 x 机器之心-再谈复现 …

如何利用HubSpot 出海CRM实现精准海外客户定位与拓展?

在当今全球化的商业环境中,企业寻求海外市场的拓展已成为增长的重要策略。然而,海外市场的复杂性和多样性为企业带来了巨大的挑战。为了有效地定位和拓展海外客户,许多企业选择了HubSpot 出海CRM作为他们的营销和销售管理工具。今天运营坛将带…

Android Glide

1.引入glide implementation com.github.bumptech.glide:glide:4.14.2 // Skip this if you dont want to use integration libraries or configure Glide. annotationProcessor com.github.bumptech.glide:compiler:4.14.2 //Glide 注解处理器 2.AndroidManifest.xml 中添加…

HarmonyOS NEXT应用开发之LocalStorage:页面级UI状态存储

LocalStorage是页面级的UI状态存储,通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage支持UIAbility实例内多个页面间状态共享。 本文仅介绍LocalStorage使用场景和相关的装饰器:LocalStorageProp和LocalStorageLink。 说…

购买代码签名证书时需提供哪些认证资料?

在软件开发与发布过程中,确保软件的可靠性和完整性至关重要,为此购买代码签名证书是必不可少的环节。然而,许多开发者对于购买该证书所需的具体材料并不十分清楚。下面就为大家详细介绍购买代码签名证书所需材料,助您更好地筹备和…

文心一言指令词宝典之自媒体篇

作者:哈哥撩编程(视频号、抖音、公众号同名) 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 🏆 推荐专栏: 🏅…

考研||考公||就业||其他?-------愿不再犹豫

大三下了,现在已经开学一个多月了,在上个学期的时候陆陆续续吧周围有的行动早的人已经开始准备考研了,当然这只是下小部分人吧,也有一部分人是寒假可能就开始了,更多的则是开学的时候,我的直观感受是图书馆…

【Easy云盘 | 第二篇】后端统一设计思想

文章目录 4.1后端统一设计思想4.1.1后端统一返回格式对象4.1.2后端统一响应状态码4.1.3后端统一异常处理类4.1.4StringUtils类4.1.5 RedisUtils类 4.1后端统一设计思想 4.1.1后端统一返回格式对象 com.easypan.entity.vo.ResponseVO Data public class ResponseVO<T> …

Sharding

Sharding操作 什么是ShardingSharding-JDBC一、引入maven依赖 &#xff08;sharding-jdbc-spring-boot-starter&#xff09;二、水平分表操作&#xff08;一个库多个相同结构表&#xff09;其他的maven依赖版本 &#xff08;shardingsphere-jdbc-core-spring-boot-starter&…

鸿蒙:应用级变量的状态管理

状态管理模块提供了应用程序的数据存储能力、持久化数据管理能力、UIAbility数据存储能力和应用程序需要的环境状态。 说明 本模块首批接口从API version 7开始支持&#xff0c;后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 本文中T和S的含义如下&…

【翻译】F - Max Sum Counting Editorial by en_translator

给定两个序列 A 和 B&#xff0c;按照 A_i 的增序对它们进行排序&#xff08;如果 A_i 相等&#xff0c;则按照 B_i 来确定顺序&#xff09;。对于集合 {1, 2, ..., N} 的每个非空子集 S&#xff0c;满足 max_{i∈S} A_i A_{max(S)}。因此&#xff0c;我们可以将问题转化如下。…

Tensor.view()的用法

view() x.view() 是 PyTorch 中用于改变张量形状的方法之一&#xff0c;它允许你在保持张量元素总数不变的情况下&#xff0c;重新组织张量的维度和大小。 view() 方法的用法如下&#xff1a; x.view(*shape)其中 x 是要进行形状变换的张量&#xff0c;shape 是一个整数或整…