LeetCode-数组-重叠、合并、覆盖问题-中等难度

435. 无重叠区间

在这里插入图片描述
我认为区间类的题型,大多数考验的是思维能力,以及编码能力,该类题型本身并无什么算法可言,主要是思维逻辑,比如本题实际上你只需要能够总结出重叠与不重叠的含义,再加上一点编码技巧,便可完成。

解题思路

正如前面所说,那么解题的关键思路就在于找到重叠区间的特性即可,我们不妨先按照start进行一次排序,再进行观察,比如数组:[[1,2],[2,3],[3,4],[1,3]],排序后为:[[1,2],[1,3],[2,3],[3,4]],通过观察我们很容易发现,如果前一个数组的end大于下一个数组的start,则这两个数组一定发生了重叠,这个比较容易理解,如图所示:分别有两个数组[1,2][1,3]
在这里插入图片描述
重叠部分一眼可见,但关键在于产生重叠后,应该留下谁?舍弃谁?我们不妨还是画图理解,按照题目示例,接下来一组数字是[2,3]
在这里插入图片描述
我们可以分开讨论,假设我们选择保留[1,3],那么很明显下一组[2,3]将变为重叠部分。
在这里插入图片描述
而如果我们选择保留[1,2],则不会再产生重叠部分。
在这里插入图片描述

根据题目要求,需要我们通过移除最少的区间数量来实现区间互不重叠,因此应当使用第二种方案,从原理上来说,就是当两个区间产生重叠后,我们应当保留区间范围更小的一组,因为这样更有可能避免与后面的区间再产生重叠(很容易理解的一点概念:区间范围越大,越容易发生重叠

结论,假设有[[s1, e1], [s2, e2], [s3, e3] ... [sn, en]],如果e1 > s2,则将触发[s1 ,e1],[s2, e2]合并,合并规则为:如果e1 > e2,合并为[s1, e2],否则合并为[s1, e1],如果e1 <= s2,则无需合并,直接检查下一个区间即可。

代码实现

public int eraseOverlapIntervals(int[][] intervals) {// 不要忘了,先按start进行排序Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);int ans = 0;int end = intervals[0][1];for(int i = 1; i < intervals.length; i++){int start = intervals[i][0];if(end > start){end = Math.min(end, intervals[i][1]);ans++;}else{end = intervals[i][1];}}return ans;
} 

56. 合并区间

在这里插入图片描述

解题思路

本题与上一题比较相似,都是处理重叠区间的问题,我们同样可以画图理解,以题目示例1为例:[[1,3],[2,6],[8,10],[15,18]]

在这里插入图片描述
首先与前一题一样,如果前一个数组的end大于下一个数组的start,则表示一定出现了重叠,而关于end部分的去留,则正好与前一题相反,前一题保留的是较小部分,本题则需要保留较大部分。

结论,假设有[[s1, e1], [s2, e2], [s3, e3] ... [sn, en]],如果e1 >= s2,则将触发[s1 ,e1],[s2, e2]合并,合并规则为:如果e1 > e2,合并为[s1, e1],否则合并为[s1, e2],如果e1 < s2,则无需合并,直接检查下一个区间即可。

代码实现

由于本题需要在原数组上进行修改,因此先借用一个list辅助记录,实际处理逻辑并没区别。

class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);List<int[]> list = new ArrayList<>();list.add(new int[]{intervals[0][0], intervals[0][1]});for(int i = 1; i < intervals.length; i++){int start = intervals[i][0];int end = intervals[i][1];if(list.get(list.size()-1)[1] < start){list.add(new int[]{start, end});}else{list.get(list.size()-1)[1] = Math.max(end, list.get(list.size()-1)[1]);}}return list.toArray(new int[list.size()][]);}
}

1288. 删除被覆盖区间

在这里插入图片描述

解题思路

前面两题处理的都是数据范围重叠的问题,本题要解决的则是数据范围覆盖问题,我们先要搞清楚符合覆盖的条件有哪些?很明显,当s1 <= s2 且 e2 <= e1时,则认为[s2, e2]区间被[s1, e1]区间覆盖。

如下图所示:
在这里插入图片描述

结论,假设有[[s1, e1], [s2, e2], [s3, e3] ... [sn, en]],当s1 <= s2 且 e2 <= e1时,则可删除区间[s2, e2],这里需要注意的是,为了方便处理,我们可以让start按照升序排序的同时,并让end按照降序排序,这样代码实现时只要满足e1 >= e2即可认为被覆盖了。实际上就是为了方便进行判断s1 <= s2 且 e2 <= e1

代码实现

class Solution {public int removeCoveredIntervals(int[][] intervals) {Arrays.sort(intervals, (o1, o2) -> o1[0] == o2[0] ? o2[1] - o1[1] : o1[0] - o2[0]);int cnt = 0;int preEnd = intervals[0][1];for (int i = 1; i < intervals.length; i++) {int curEnd = intervals[i][1];if (preEnd >= curEnd) {cnt++;} else {preEnd = curEnd;}}return intervals.length - cnt;}
}

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

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

相关文章

Java期末复习题之封装

点击返回标题->23年Java期末复习-CSDN博客 第1题. 定义一个类Person,定义name和age私有属性&#xff0c;定义有参的构造方法对name和age进行初始化。在测试类中创建该类的2个对象&#xff0c;姓名、年龄分别为lili、19和lucy、20&#xff0c;在屏幕打印出2个对象的姓名和年龄…

JavaScript-节点操作

节点操作 DOM节点 DOM节点&#xff1a;DOM树里每一个内容都称之为节点 节点类型&#xff1a; 元素节点 所有的标签 比如body、divhtml时跟节点 属性节点 所有的属性&#xff0c;比如href 文本节点 所有的文本 其他 查找节点 节点的关系&#xff1a;针对的找亲戚返回的都是…

每日一题 70. 爬楼梯(简单)

简单题&#xff0c;动态规划 class Solution:def climbStairs(self, n: int) -> int:a, b 1, 2for _ in range(n - 2):t a ba bb treturn b if n ! 1 else 1

如何掌握构建 LMS 网站的艺术

目录 什么是学习管理系统 (LMS) 在线课程和 LMS 网站的好处 为什么 WordPress 对于 LMS 网站很重要 统一学习中心 多功能性和可扩展性 提高教育参与度 简化管理和监控 节省时间和费用 技能评估和绩效监督 持续学习和技能提升 使用 WordPress 插件构建成功的 LMS 课程 专注于您的…

高龄服务器终于挂掉了

连续运行了3018天的高龄服务器硬盘挂了&#xff0c;昨晚整了一个通宵&#xff0c;困极。 负载不高&#xff0c;IO稍微有点高。 硬盘报错&#xff0c;系统盘没问题&#xff0c;是一块独立的SCSI盘坏了&#xff0c;里边存储的是MySQL用户数据&#xff0c;可以访问目录&#xff0c…

JDK8新特性:Lambda表达式规则及用法,方法引用

目录 Lambda表达式是JDK8新增的一种语法格式 1.作用 2.用法规则&#xff1a; 3.方法引用 Lambda表达式是JDK8新增的一种语法格式 1.作用 简化匿名内部类的代码写法 Lambad用法前提&#xff1a;只能简化函数式接口&#xff08;一般加有Funcationallnterface&#xff09;&a…

二维码智慧门牌管理系统:优化车位管理体验

文章目录 前言一、规范信息记录&#xff1a;提升管理效率二、优化产权管理&#xff1a;智能化信息记录三、智能化车位管理&#xff1a;提升效率与便捷性四、未来展望&#xff1a;持续升级与智能化发展 前言 城市车位管理挑战 随着城市化的推进&#xff0c;车位紧缺问题日益突出…

postgresql安装部署(docker版本)

1.在线部署 创建数据库存储目录 mkdir /home/pgdata创建容器 docker run --name postgresql --restartalways -d -p 5432:5432 -v /home/pgdata:/var/lib/postgresql/data --shm-size10g -e POSTGRES_PASSWORD密码 postgis/postgis:12-3.2-alpine–name为设置容器名称 -d表…

ArkTs基础语法一

1、条件渲染 Column() {if (this.count > 0) {Text(count is positive)} }2、循环渲染 ForEach(arr: any[], // 用于迭代的数组itemGenerator: (item: any, index?: number) > void, // 生成子组件的lambda函数keyGenerator?: (item: any, index?: number) > str…

大数据技术7:StarRocks极速全场景MPP数据库

前言&#xff1a;StarRocks原名DorisDB&#xff0c;是新一代极速全场景MPP数据库。StarRocks 是 Apache Doris 的 Fork 版本。StarRocks 连接的多种源。一是通过这个 CDC 或者说通过这个 ETL 的方式去灌到这个 StarRocks 里面&#xff1b;二是还可以去直接的和这些老的 kafka 或…

分布式事务Seata(别名Seta)(持续学习中)

1.为什么学习他? 当一台机器的时候,只需要本地事务回滚就好了,还有MonogoDB最好不要放敏感数据,特别是旧的版本,没有事务功能(ACID), 分布式事务,也是属于多线程问题,就是把多台机器变成一台机器(他拥有更多线程,但是也要考虑网络问题),redis在一台机器是单线程的,但是多台机器…

AI 绘画 | Stable Diffusion 艺术二维码制作

前言 这篇文章教会你如果用Stable Diffusion WEB UI制作艺术二维码,什么是艺术二维码呢?就是普通二维码和艺术图片融合后的二维码图片,如下图所示。主要原理还是使用controlNet的control_v1p_sd15_qrcode_monster模型和光影模型control_v1p_sd15_brightness。 教程 准备…