LeetCode算法题解|LeetCode435. 无重叠区间、LeetCode763. 划分字母区间、LeetCode56. 合并区间

一、LeetCode435. 无重叠区间

题目链接:435. 无重叠区间
题目描述:

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

提示:

  • 1 <= intervals.length <= 105
  • intervals[i].length == 2
  • -5 * 104 <= starti < endi <= 5 * 104
算法分析:

按照区间的有边界大小进行排序。

然后判断上一个区间的右边界是否在当前区间内部。如果是,说明两区间重叠了,删掉该区间,再继续判断下一个;如果没有在区间内部说明没有重叠,两个区间都是合理的,判断下一个区间。

代码如下:

class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, (s1, s2) -> s1[1] - s2[1]);//对区间数组按照区间右边界的位置大小进行排序int lastEnd = intervals[0][1];//上一个合理区间的有边界位置int count = 0;for(int i = 1; i < intervals.length; i++) {//如果当前区间的左边界小于上一个合理区间的右边界(即上一个合理区间与该区间就发生重叠)移除区间,否则两区间不发生重叠,当前区间合理,将当前区间的右边界赋给lastEnd,继续去判断下一个区间if(lastEnd > intervals[i][0]) count++;//else lastEnd = intervals[i][1];}return count;}
}

二、LeetCode763. 划分字母区间

题目链接:763. 划分字母区间
题目描述:

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。 

示例 2:

输入:s = "eccbbbbdec"
输出:[10]

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母组成
算法分析:

标记每个字符在字符串中出现的末尾位置。

然后遍历整个字符串,更新每个字符所辐射的最大范围。

如果当前下标就等于之前字符辐射的最大范围的话,那么当前的位置就是一个字符串的分割点。

代码如下:

class Solution {public List<Integer> partitionLabels(String s) {int[] arr = new int[26];//用来记录每个字符最后一次出现的位置for(int i = 0; i < s.length(); i++)arr[s.charAt(i) - 'a'] = i;List<Integer>list = new ArrayList<>();int left = 0;//字符串片段的起始位置int right = 0;//字符串片段结束位置for(int i = 0; i < s.length(); i++) {//每次更新每个字符串片段所能辐射的最远位置。right = Math.max(arr[s.charAt(i) - 'a'], right);if(i == right) {//如果字符串片段结束的位置刚好是当前的位置,将这段字符串长度放到数组当中,然后寻找下一段字符串的长度list.add(right - left + 1);left = i + 1;}}return list;}
}

三、LeetCode56. 合并区间

题目链接:56. 合并区间
题目描述:

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104
算法分析:

这道题需要先对每个区间按照左区间的大小排序,然后再来进行合并重复区间。

这里有三种情况分别需要进行处理:

一是如果上一个区间的末尾在当前区间的右边说明当前区间是完全包含于上一个区间的,此时无需任何操作;

二是如果上一个区间的末尾是在当前区间内部,那么就需要对两个区间进行合并,新的区间左区间是上一个区间的左区间,右区间就变成当前区间的右区间了。

三是如果上一区间的右区间在当前区间的左边,那么两区间就没有重叠部分,将上一个区间放到结果集里,然后在寻找下一个无重叠区间。

注意这里说的“上一个区间”是一个不断变动的区间,用来确定每一个合并之后不在于其他区间重叠的区间。

代码如下:

class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, (s1, s2) -> s1[0] - s2[0]);//按照左区间的从小到大进行排序int start = intervals[0][0];//合并后的左区间int end = intervals[0][1];//合并后的右区间LinkedList<int[]>res = new LinkedList<>();//放不重叠的区间数组for(int i = 1; i < intervals.length; i++) {if(end > intervals[i][1]) continue;//如果上一个右区间的大于当前区间的右区间,说明当前区间完全包含于上一个区间。else if(end >= intervals[i][0] && end <= intervals[i][1]) {//如果上一个区间的右区间在当前区间内部,说明两个区间有重叠,进行合并,合并后的左区间不变,右区间扩大到当前区间的右区间大小end = intervals[i][1];}else {//如果上一个区间的右区间小于当前区间的左区间,说明两个区间没有交集,不需要合并,得到一个没有重叠的区间,将其放入结果集,在更新下一个区间的左右区间int[] a = new int[2];a[0] = start;a[1] = end;res.add(a);start = intervals[i][0];end = intervals[i][1];}}//将最后一个区间放入结果集当中int[] a = new int[2];a[0] = start;a[1] = end;res.add(a);return res.toArray(new int[res.size()][2]);//将结果集转化为数组返回}
}

总结

一三题的解法类似,比较容易做出来,第二题的话,利用每个字符的辐射范围来确定字符串片段的长度这个方法不容易想出来。

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

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

相关文章

深度学习YOLOv5车辆颜色识别检测 - python opencv 计算机竞赛

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

linux高级篇基础理论一(详细文档、Apache,网站,MySQL、MySQL备份工具)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

【笔记 Pytorch】稀疏矩阵、scipy.sparse模块的使用

安装&#xff1a;pip install scipy 描述&#xff1a;就是专门为了解决稀疏矩阵而生。导入模块&#xff1a;from scipy import sparse 优缺点总结 七种矩阵类型描述coo_matrix ★【名称】coordinate format 【优点】    ① 不同稀疏格式间转换效率高(特别是CSR和CSC)  …

如何打包成一个可安装的Android应用程序包

在Android安卓开发中&#xff0c;打包APK通常是指将你的应用程序代码和资源打包成一个可安装的Android安卓应用程序包。以下是打包APK的基本步骤&#xff1a; 配置项目&#xff1a;在Android Studio中&#xff0c;打开你的项目&#xff0c;确保已经配置了正确的项目名称、包名…

读取PDF中指定数据写入EXCEL文件

使用Java读取文件夹中的PDF文件,再读取文件中的指定的字体内容,然后将内容写入到Excel文件中,其中包含一些正则判断,可以忽略,字体以Corbel字体为例。 所需要的maven依赖为: <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel…

VS2022升级之后,原有项目出现异常

最近对VS2022做了升级&#xff0c;发现之前开发的WebApi&#xff08;使用Net5&#xff09;调试运行报错&#xff1a; 根据提示的错误信息也在网上查找了一些资料&#xff0c;均无法正常解决&#xff0c;偶然发现问题是因为VS2022升级之后&#xff0c;不再支持Net5&#xff0c;…

【开源】基于Vue和SpringBoot的固始鹅块销售系统

项目编号&#xff1a; S 060 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S060&#xff0c;文末获取源码。} 项目编号&#xff1a;S060&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固…

论文技巧2

目录 1 找基准模型2 找模块小论文的三个实验怎么做对比试验Sota的挑选对⽐论⽂结果的获取3 消融实验什么是消融实验怎么做消融实验4 实例分析怎么做实例分析小论文必备三张图1 找基准模型 2 找模块 小论文的三个实验 怎么做对比试验

前端项目--命名规范

1. 文件命名&#xff1a; 项目命名&#xff1a;以小写字母命名&#xff0c;中划线分割。如my-project。 目录命名&#xff1a;以小驼峰命名法&#xff0c;除第一个单词之外&#xff0c;其他单词首字母大写。如myDir。JS/TS 文件&#xff1a;以小写字母命名&#xff0c;多个单词…

高性能音乐流媒体服务Diosic

什么是 Diosic ? Diosic 是一个开源的基于网络的音乐收集服务器和流媒体。主要适合需要部署在硬件规格不高的服务器上的用户。Diosic 是使用 Rust 开发的&#xff0c;具有低内存使用率和高性能以及用于流媒体音乐的非常干净的界面。 安装 在群晖上以 Docker 方式安装。 在注…

基于JavaWeb+SpringBoot+Vue医疗器械商城微信小程序系统的设计和实现

基于JavaWebSpringBootVue医疗器械商城微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 摘 要 目前医疗器械行业作为医药行业的一个分支&#xff0c;发展十分迅速。…

ceph集群移除物理节点

1. 概述 ceph分布式存储在生产或者实验环境&#xff0c;经常涉及到物理节点加入或者删除&#xff0c;本文仅对移除物理节点的相关步骤做了操作记录&#xff0c;以方便需要时查阅。 2. 移除物理节点 2.1 out掉相应osd 操作之前通过ceph -s确保整个集群状态是OK的&#xff0c;…

Sql Prompt 10下载安装图文教程

在操作过程中&#xff0c;请暂时关闭你的防病毒软件&#xff0c;以免其误报导致操作失败。 资源 SQL Prompt 10 https://www.aliyundrive.com/s/QuMWkvE1Sv6 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&…

【数据结构】树与二叉树(十六):二叉树的基础操作:插入结点(算法Insert)

文章目录 5.2.1 二叉树二叉树性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点&#xff0c;其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

通讯录实现之进阶版将通讯录数据保存在文件中(完整代码)

我们在之前的博客中已经写过两版通讯录了&#xff1a; 第一版是用C语言实现了通讯录&#xff0c;但是通讯录的存储人数信息是固定的&#xff0c;用完就没有了 感兴趣的可以转到对应博客看一下&#xff0c;附带链接&#xff1a;第一版通讯录 第二版是在第一版的基础上动态开辟…

三大开源向量数据库大比拼

向量数据库具有一系列广泛的好处&#xff0c;特别是在生成式人工智能方面&#xff0c;更具体地说&#xff0c;是在大语言模型&#xff08;LLM&#xff09;方面。这些好处包括先进的索引和精确的相似度搜索&#xff0c;有助于交付强大的先进项目。 本文将对三种开源向量数据库&…

NTP时钟同步服务器(卫星授时服务)在云计算数据机房的应用

NTP时钟同步服务器&#xff08;卫星授时服务&#xff09;在云计算数据机房的应用 NTP时钟同步服务器&#xff08;卫星授时服务&#xff09;在云计算数据机房的应用 1、云计算定义与特点 云计算概念定义 现阶段广为被接受的定义来自于每个国家标准与技术研究院&#xff08;NIS…

shell之xargs命令介绍

shell之xargs命令介绍 参数用法介绍 参数 xargs命令的参数选项包括&#xff1a; -a file&#xff1a;从文件中读入作为stdin。 -e flag&#xff1a;注意有的时候可能会是-E&#xff0c;flag必须是一个以空格分隔的标志&#xff0c;当xargs分析到含有flag这个标志的时候就停止…

虚幻引擎:UEC++中如何解析JSON字符串

一丶解析对象型JSON //解析对象形JSONFString JsonString TEXT("{\"name\":\"二狗\"}");//通过解析工厂创建解析阅读器TSharedRef<TJsonReader<>> Json TJsonReaderFactory<>::Create(JsonString);//创建用于接收的UE的Jso…

使用Vue实现弹窗效果

弹窗效果是在Web开发中经常用到的一种交互效果&#xff0c;它可以在用户点击某个按钮或者触发某个事件时显示一个悬浮框&#xff0c;提供用户与页面进行交互的机会。Vue作为一种流行的JavaScript框架&#xff0c;提供了丰富的工具和方法&#xff0c;可以方便地实现弹窗效果。本…