代码随想录算法训练营第二十七天|93.复原IP地址、78.子集、90.子集II
93.复原IP地址
- 刷题
https://leetcode.cn/problems/restore-ip-addresses/description/ - 文章讲解
https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html - 视频讲解
https://www.bilibili.com/video/BV1XP4y1U73i/?vd_source=af4853e80f89e28094a5fe1e220d9062 -
回溯树图示:

-
题解(字符串普通解法):
class Solution {//存储结果List<String> result = new ArrayList<>();public List<String> restoreIpAddresses(String s) {//剪枝,去除非法长度if(s.length() > 12){return result;}restoreIpAddresses1(s, 0, 0);return result;}//startIndex:for循环起始index//pointNum:标记逗点添加的个数,作为递归出口public void restoreIpAddresses1(String s, int startIndex, int pointNum){//递归出口//已添加3个逗点,分割结束if(pointNum == 3){//需要判断最后一段是否合法(区间均为左闭右闭)if(isValid(s, startIndex, s.length() - 1)){result.add(s);}//无论是否合法,此时均需结束,returnreturn;}//递归回溯部分//以startIndex为划分界限for(int i = startIndex; i < s.length(); i++){//若当前划分区间符合要求则往下处理if(isValid(s, startIndex, i)){//加工逗点处理(substring左闭右开)//在i和i+1中间插入逗点s = s.substring(0, i + 1) + "." + s.substring(i + 1);//已添加了一个逗点pointNum++;//递归//需要把已添加逗点的位置空出来,所以是i+2为起始(i+1为逗点)restoreIpAddresses1(s, i + 2, pointNum);//回溯pointNum--;//空出了i+1的逗点位置,删掉逗点s = s.substring(0, i + 1) + s.substring(i + 2);}else{//若当前划分区间不合要求,则结束当前循环返回上一层break;}}}public boolean isValid(String s, int start, int end){//根据区间左闭右闭判断终止条件if(start > end){return false;}//不合法情况;0开头数字不合法,0单独的数字合法if(s.charAt(start) == '0' && start != end){return false;}int num = 0;for(int i = start; i <= end; i++){//字符Ascll码比较if(s.charAt(i) > '9' || s.charAt(i) < '0'){return false;}//计算当前总和是否合法num = num * 10 + (s.charAt(i) - '0');if(num > 255){return false;}}return true;}
}
78.子集
- 刷题
https://leetcode.cn/problems/subsets/description/ - 文章讲解
https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html - 视频讲解
https://www.bilibili.com/video/BV1U84y1q7Ci/?vd_source=af4853e80f89e28094a5fe1e220d9062 -
回溯树图示:

-
题解:
class Solution {//存放最后符合条件结果的集合List<List<Integer>> result = new ArrayList<>();//每次符合条件的结果LinkedList<Integer> path = new LinkedList<>();//这道题目与之前题目的区别在于://这道题是求子集,回溯树上每一个结点都需要取值//之前的组合问题,回溯树上只取叶子结点的值public List<List<Integer>> subsets(int[] nums) {subsets1(nums, 0);return result;}public void subsets1(int[] nums, int startIndex){//需要先将当前结点放入最后结果集,因为若放在递归出口后面,就会漏掉叶子结点的结果result.add(new ArrayList<>(path));//递归出口if(startIndex >= nums.length){return;}for(int i = startIndex; i < nums.length; i++){path.add(nums[i]);//递归部分//为了防止集合重复,需要startIndex+1subsets1(nums, i + 1);//回溯部分path.removeLast();}}
}
90.子集II
- 刷题
https://leetcode.cn/problems/subsets-ii/description/ - 文章讲解
https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html - 视频讲解
https://www.bilibili.com/video/BV1vm4y1F71J/?vd_source=af4853e80f89e28094a5fe1e220d9062
-
回溯树图示:

-
题解:
class Solution {//存储所有的结果List<List<Integer>> result = new ArrayList<>();//存放当前符合条件的结果LinkedList<Integer> path = new LinkedList<>();//标记当前元素是否使用过,用来进行树层去重boolean[] used;//本题与上一个的区别在于去重,其他则同样需要收集回溯树上的每一个结点public List<List<Integer>> subsetsWithDup(int[] nums) {if(nums.length == 0){return result;}Arrays.sort(nums);used = new boolean[nums.length];subsetsWithDup1(nums, 0);return result;}public void subsetsWithDup1(int[] nums, int startIndex){//因为需要添加回溯树上的每个结点,所以需要最先添加//并且为了不漏下叶子结点上的结果,要放在递归出口的前面result.add(new ArrayList<>(path));//递归出口if(startIndex >= nums.length){return;}//递归回溯部分for(int i = startIndex; i < nums.length; i++){//树层去重if(i > 0 && nums[i] == nums[i - 1] && !used[i - 1]){continue;}path.add(nums[i]);used[i] = true;//递归部分,上下级需要防重复subsetsWithDup1(nums, i + 1);//回溯部分path.removeLast();used[i] = false;}}
}相关文章:
代码随想录算法训练营第二十七天|93.复原IP地址、78.子集、90.子集II
93.复原IP地址 刷题https://leetcode.cn/problems/restore-ip-addresses/description/文章讲解https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html视频讲解https://www.bilibili.com/video/BV1XP4y1U73i/?vd_sourceaf4853e80f89e28094a5fe1e220d9…...
【蓝桥备赛】字串简写
字串简写 数据范围 字符串的长度为5*10的五次方,on方时间复杂度会很大。 才用动态规划的思想,dp[i]以i开头的的可能性,因为长度必须大于等于k,当i小于k的时候,如果等于第一个字符,s1时,dp[…...
nios ii开发随笔
错误一: d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: test.elf section .text will not fit in region ram_oc_xzs d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_6…...
SpringBoot项目嵌入RabbitMQ
在Spring Boot中嵌入RabbitMQ可以通过添加相应的依赖来完成。首先需要在pom.xml文件中引入spring-boot-starter-amqp依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</a…...
提升网络质量:UDPspeeder 实现网络优化与提速
提升网络质量:UDPspeeder 实现网络优化与提速 背景与意义原理与功能使用方法未来展望相关链接服务 在当今高度互联的网络环境下,网络质量的优化和提速对于用户体验至关重要。针对高延迟和丢包率较高的网络链路,UDPspeeder 提供了一种前向纠错…...
为什么前端开发变得越来越复杂了?这可能是我们的错
前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello,大家好,我是 Sunday。 最近有很多同学来问我:“Sunday 老师,前端学起…...
VR系统的开发流程
虚拟现实(Virtual Reality,VR)系统是一种通过计算机技术模拟出的具有三维视角和交互性的虚拟环境,使用户能够沉浸在其中并与虚拟环境进行交互。这种技术通常利用头戴式显示器和手柄等设备,使用户能够感觉到仿佛身临其境…...
前端输入框校验限制不能输入中文
一般我们在做表单的时候都会有表单校验,通常都是用element提供的表单验证的功能,只需要通过 rules 属性传入约定的验证规则,如下面这样 rules: {userName: [{validator: checkUsername,trigger: "blur",},{ validator: this.checkData, trigge…...
强大的文本绘图——PlantUML
PlantUML是一款开源工具,它允许用户通过简单的文本描述来创建UML图(统一建模语言图)。这种方法可以快速地绘制类图、用例图、序列图、状态图、活动图、组件图和部署图等UML图表。PlantUML使用一种领域特定语言(DSL)&am…...
ES相关问题
在Elasticsearch(ES)集群中,节点根据其配置和角色可以分为以下几种主要类型: Master Node(主节点): 主节点负责管理整个集群的元数据,如索引的创建、删除、分片分配等。它维护着集群…...
基于Linux直接安装的Nginx版本升级方法
引言 随着版本的迭代和漏洞的发现,Nginx作为一款软件避免不了打补丁的命运。 以下基于Linux直接安装的Nginx版本升级。 以下操作均在本地虚拟机中操作验证,请验证后再线上操作。基于centos7测试。 前置资源 获取nginx的最新源码版本网址:…...
探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,并且坚持默默的做事。 探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换 文章目录 一、案例…...
力扣hot100题解(python版10-12题)
哎- -最近本来就没时间写算法 这算法怎么还这么难。。。 10、和为 K 的子数组 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1]…...
【算法】复杂度分析
第一章、如何分析代码的执行效率和资源消耗 我们知道,数据结构和算法解决的是“快”和“省”的问题,也就是如何让代码运行得更快,一级如何让代码更节省计算机的存储空间。因此,执行效率是评价算法好坏的一个非常重要的指标。那么&…...
车载电子测试学习内容
搜集了一些车载测试的学习内容,大家可以参考。...
STM32F103x 的时钟源
AHB (Advanced High-performance Bus) 高速总线,用来接高速外设的。 APB (Advanced Peripheral Bus) 低速总线,用来接低速外设的,包含APB1 和 APB2。 APB1:上面连接的是低速外设,包括电源接口、备份接口、 CAN 、 US…...
【电路笔记】-RC放电电路
RC放电电路 文章目录 RC放电电路1、概述2、RC放电电路3、RC放电电路示例当电压源从完全充电的 RC 电路中移除时,电容器 C 将通过电阻 R 放电。 1、概述 RC 放电电路利用电阻器-电容器组合的固有 RC 时间常数以指数衰减率对电容器进行放电。 在之前的 RC 充电电路教程中,我们…...
【C++STL】STL容器详解
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c系列专栏:C/C零基础到精通 🔥 给大…...
缓存篇—缓存雪崩
什么是缓存雪崩 通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库,并…...
力扣日记2.22-【回溯算法篇】47. 全排列 II
力扣日记:【回溯算法篇】47. 全排列 II 日期:2023.2.22 参考:代码随想录、力扣 47. 全排列 II 题目描述 难度:中等 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
