【力扣一刷】代码随想录day28(93.复原IP地址、78.子集、90.子集II )

目录

【93.复原IP地址】中等题(偏难,坑很多)

【78.子集】中等题(偏简单)

【90.子集II】中等题


【93.复原IP地址】中等题(偏难,坑很多)

思路:以101023为例子

1、将题目抽象成树,子节点为指定开始索引start的子串,在遍历子节点的时候进行剪枝(打叉的地方表示剪枝),保证子节点合法

2、利用len指示IP的长度,如果已经够4个IP段,则处理结果。(图中是圆圈标注的是处理的结果,×表示长度够了,但是数组中数字没用完,不需要记录结果;√ 表示长度够了,数组中数字也用完了,得记录结果)

关键:重点考虑三个问题

  • 剪枝1:如果当前子节点>255怎么办?当前及剩下的子节点不需要遍历,使用break跳出for循环
  • 剪枝2:如果剩下的数字不足以构成4个IP段怎么办?当前及剩下子节点不需要遍历,使用break跳出for循环
  • 剪枝3:如果当前子节点以0开头怎么办?只递归遍历单独"0"这个子串的分支,​遍历完后直接return,不再遍历剩下的"0x"不合法的IP段。​​​​​​(图中的方框处就是遍历单独的"0")
class Solution {List<String> res = new ArrayList<>();StringBuffer path = new StringBuffer();public List<String> restoreIpAddresses(String s) {backtracking(s, 0, 0);return res;}// start是指当前层的所有子节点对应子串在数组中的开始索引// len是指当前层对应的IP段索引,从0开始,0-3对应4个IP段,当len - 4时,说明已经够4个IP段了,得考虑是否记录结果了public void backtracking(String s, int start, int len){// 终止条件(长度够了,判断 -> 数字用完了/数字没用完)if (len == 4){// 数组中的数字没用完if (start < s.length()) return; // 不记录,直接返回// 数组中的数字用完了else{// 这里不能直接删除path最后一个".",否则回溯恢复现场的时候会出错String ss = path.toString();res.add(ss.substring(0, ss.length() - 1));  // 把最后一个"."删除,再记录结果return;}}// 单层递归逻辑// 遍历所有子节点(左闭右闭,i指示的是子串的结束索引,包含i)for (int i = start; i < s.length(); i++){String sub = s.substring(start, i+1); // 取子串是左闭右开// 剪枝1:使IP有效(如果当前子节点超过255,就不需要再遍历剩下的子节点)if (Integer.valueOf(sub) > 255) break;  // 注意是break,不是continue// 剪枝2:加速遍历(如果剩下的数字不足以构建剩下的IP段(path需要4个IP段),则不再遍历剩下的子节点)if (s.length() - i - 1 < 4 - len - 1) break;path.append(sub + ".");backtracking(s, i+1, len+1); // 当前子串i结束,那下个子串就从i+1开始path.delete(path.length() - sub.length() - 1, path.length()); // 把子串和"."一起删除// 剪枝3:使IP有效(可以是单独的0,但是不能是以0开头的其它整数)if (sub.startsWith("0")) return; // 如果字符串的开头是"0",只需要把"0"的分支遍历完即可返回,其余的不合法}}}

总结:

1、String类的常用方法

2、StringBuffer的常用方法

补充刷题常用的方法:

  • 删除指定索引的字符:deleteCharAt(int index);
  • 删除指定索引范围的字符串:delete(int start, int end);


【78.子集】中等题(偏简单)

思路:递归前在结果集中加入空集,递归过程中遍历的每个子节点都要把路径记录到结果集

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {res.add(new ArrayList(path)); // 加入空集backtracking(nums, 0);return res;}public void backtracking(int[] nums, int start){for (int i = start; i < nums.length; i++){path.add(nums[i]);res.add(new ArrayList(path));  // 每个子节点都需要记录路径backtracking(nums, i + 1);path.remove(path.size() - 1);}}
}


【90.子集II】中等题

思路:【78.子集】的区别在于,元素可以在数组中重复出现,需要先排序,后去重。

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);  // 先对nums进行排序,便于后序的去重backtracking(nums, 0);  // 不需要再单独加入空集,因为一进入递归,当前节点对应路径就是空集return res;}public void backtracking(int[] nums, int start){// 记录当前节点对应的路径res.add(new ArrayList(path));for (int i = start; i < nums.length; i++){// 去重:如果当前层前面已经遍历过相同的子节点,就不再记录当前子节点对应路径和递归遍历当前子节点if (i > start && nums[i] == nums[i - 1]) continue;  // 注意是i > start,而不是i>0,i>0不能代表同一层的子节点path.add(nums[i]);backtracking(nums, i + 1);path.remove(path.size() - 1);}}
}

注意:去重的时候,是判断当前子节点在当前层前面是否已经遍历过,是 i > start, 而不是 i > 0。i > start才能保证判断的是当前层的第二个节点,而当前层的第一个节点也可能符合 i > 0,万一该节点等于数组中上一个节点的值,则该节点就无法遍历了。

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

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

相关文章

输出100~200之间的素数(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现素数判断函数&#xff1b; int Prime(int number) {//初始化变量值&#xff1b;int divided 2;int JudgementCondition 0;//循环判断素数&#xff1b;wh…

(C)1007 素数对猜想

1007 素数对猜想 问题描述 输入样例&#xff1a; 20 输出样例&#xff1a; 4 解决方案&#xff1a; #include<stdio.h> #include<string.h> #include<math.h> int main(){int n,d;int a[100000];int flag,jishu0;scanf("%d",&n);memset(a,-1,…

基于51单片机甲醛浓度检测设计

基于51单片机甲醛浓度检测设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.甲醛浓度数据经过单片机处理&#xff0c;由LCD1602实时显示。 2.可通过按键设置甲醛报警阈值&#xff…

RK3568驱动指南|第十四篇 单总线-第158章DS18B20编写字符设备驱动框架

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

鸿蒙原生应用开发-网络管理HTTP数据请求

一、场景介绍 应用通过HTTP发起一个数据请求&#xff0c;支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 二、接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 涉及的接口如下表&#xff0c;具体的…

【pytest】fixture机制

目录 概念fixture 的主要特点测试场景1. 准备和清理测试数据2. 模拟外部依赖3. 共享资源&#xff08;如数据库连接&#xff09;4. 使用内置 fixture5. 自动使用 fixture 用途 概念 fixture机制是pytest测试框架中的一个核心概念&#xff0c;它提供了一种用于处理测试所需资源的…

vim中如何使用Vundle插件管理器?

本文结构&#xff1a; a、简介 b、安装 c、用法举例 a、Vundle是一个Vim插件管理器&#xff0c;它极大地简化了Vim插件的安装、更新和卸载过程。Vundle通过简化Vim插件的管理过程&#xff0c;帮助用户更高效地定制他们的Vim编辑环境。 b、安装Vundle Vundle的安装通常是通…

鸿蒙OS元服务开发:【WebGL网页图形库开发概述】

WebGL的全称为Web Graphic Library(网页图形库)&#xff0c;主要用于交互式渲染2D图形和3D图形。目前HarmonyOS中使用的WebGL是基于OpenGL裁剪的OpenGL ES&#xff0c;可以在HTML5的canvas元素对象中使用&#xff0c;无需使用插件&#xff0c;支持跨平台。WebGL程序是由JavaScr…

HBase报错:Master is initializing

现象&#xff1a;org.apache.hadoop.hbase.PleaseHoldException: Master is initializing 描述&#xff1a;在启动HBase之后进入bin/hbase shell 命令行进行一些操作&#xff0c;比如建表或者添加数据到表中出现这种报错org.apache.hadoop.hbase.PleaseHoldException: Master …

《信息技术服务 智能运维 第2部分:数据治理》国家标准2024年第一次线下编写会议成功召开

2024年3月13日~15日&#xff0c;由运维数据治理国标编制组主办的运维数据治理国家标准2024年第一次编写工作会议在上海成功召开。 本次会议由云智慧&#xff08;北京&#xff09;科技有限公司承办&#xff0c;来自南网数字集团信通公司、太保科技、平安银行、广发银行、广东农…

LeetCode:1997. 访问完所有房间的第一天(DP Java)

目录 1997. 访问完所有房间的第一天 题目描述&#xff1a; 实现代码与解析&#xff1a; DP 原理思路&#xff1a; 1997. 访问完所有房间的第一天 题目描述&#xff1a; 你需要访问 n 个房间&#xff0c;房间从 0 到 n - 1 编号。同时&#xff0c;每一天都有一个日期编号&…

hadoop3.0 非高可用安装

伪分布式集群&#xff0c;不依赖zookeeper的hadoop集群 只有namenode, 和datanode, 可以有两个namenode. 没有zookeeper, 没有zkfc, 没有journalnode. 只在学习的时候使用, 生存环境不适用 . 生产环境用的高可用集群见 https://blog.csdn.net/weijiqian/article/details/13715…

什么是AIGC,AIGC的应用领域有哪些,以及对AIGC的未来展望有什么值得关注的方向

AIGC:人工智能生成内容的深度解析 在数字技术的浪潮中,AIGC(ArtificialIntelligenceGeneratedContent,人工智能生成内容)逐渐崭露头角,成为继专业生产内容(PGC)和用户生产内容(UGC)之后的新型内容创作方式。它不仅改变了内容生产的传统模式,更在多个行业中展现出…

QA测试开发工程师面试题满分问答6: 如何判断接口功能正常?从QA的角度设计测试用例

判断接口功能是否正常的方法之一是设计并执行相关的测试用例。下面是从测试QA的角度设计接口测试用例的一些建议&#xff0c;包括功能、边界、异常、链路、上下游和并发等方面&#xff1a; 通过综合考虑这些测试维度&#xff0c;并设计相应的测试用例&#xff0c;可以更全面地评…

蓝桥杯第十五届抱佛脚(七)前缀和与差分

蓝桥杯第十五届抱佛脚&#xff08;七&#xff09;前缀和与差分 前缀和 前缀和算法是一种在数组处理中非常有效的技术&#xff0c;特别是当需要频繁查询某个固定区间内的元素和时。这种算法可以在 O(N) 的时间内预处理数组&#xff0c;并且能在 O(1) 的时间内回答区间和的查询…

CCF-B推荐会议 ICSME’24 4月11日截稿 速来参与

会议之眼 快讯 第40届ICSME 2024 (IEEE International Conference on Software Maintenance and Evolution)即IEEE软件维护与发展国际会议将于 2024 年 10月6日-11日在美国弗拉格斯塔夫阿兹举行&#xff01;ICSME是学术界、工业界和政府研究人员和从业者的首要国际论坛&#x…

阿里AI编码助手“通义灵码”安装及使用

1.介绍 “通义灵码”是一款基于阿里云通义代码大模型打造的智能编码助手&#xff0c;产品于2023年10月31日云栖大会上&#xff0c;正式对外发布。 核心使用场景&#xff1a;代码智能生成和研发智能问答。 主要功能点&#xff1a; &#xff08;1&#xff09;行级/函数级实时…

BPMN的发展及简介

背景 BPM“通过建模、自动化、管理和优化流程&#xff0c;打破跨部门跨系统业务过程依赖、打破信息孤岛&#xff0c;提高业务效率和效果”&#xff0c;通俗一点讲&#xff0c;就是工作流引擎。在进行流程设计时&#xff0c;需要将流程的元素进行定义&#xff0c;并按照一定的格…

PSDK 102S V3:航测领域的革新者

在航测领域&#xff0c;精确、高效的数据获取一直是行业追求的目标。PSDK 102S V3&#xff0c;作为SHAR三赛尔推出的一款高性能倾斜摄影相机&#xff0c;凭借其先进的技术和卓越的性能&#xff0c;正在成为航测领域的革新者。 自研三轴智能稳定云台&#xff1a;PSDK 102S V3配备…

Canal1.1.5整Springboot在MQ模式和TCP模式监听mysql

canal本实验使用的是1.1.5&#xff0c;自行决定版本&#xff1a;[https://github.com/alibaba/canal/releases] canal 涉及的几个角色 canal-admin&#xff1a;canal 后台管理系统&#xff0c;管理 canal 服务canal-deployer&#xff1a;即canal-server&#xff08;客户端&…