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

2023-12-16

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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode-数组-重叠、合并、覆盖问题-中等难度 的相关文章

随机推荐

  • 程序员养生指南

    目录 前言 调整工作习惯 保持合理饮食 积极参与活动 保持良好睡眠 精神调适与放松 结语 前言 不用多说 想必都知道程序员是一份高强度 高压力 高危 的职业 长期坐姿 熬夜加班等不良生活习惯会对人的身体健康造成负面影响 长时间的工作 高强度
  • Vue:用IDEA开发Vue,标签语法爆红问题处理

    一 场景描述 我在 IDEA 中 学习 Vue 课程 入门学习时 是在 html 文件中 script 引入 vue js 文件方式 此时 在 html 文件中用 v 标签 爆红 二 解决办法 打开 菜单栏 File Settings 选择
  • 展会回顾|CASAIM应邀参加一汽大众秋季创新科技展,展出最新的第二代CASAIM-IS自动化测量系统

    11月30日至12月1日 CASAIM应邀参加一汽大众秋季创新科技展 展出最新的第二代CASAIM IS自动化测量系统 现场一汽大众相关领导和成员及其他厂商莅临参观 就自动化测量技术应用进行深入交流和探讨 第二代CASAIM IS自动化测量
  • 参加2023谷歌开发者社区 DevFest的洞察与感悟

    目录 前言 关于GDG 主会场精彩分享 分会场干货满满 共创未来之旅 参会体验 结束语 前言 在12月10日 DevFest又一次来临了 潮流与技术的光芒同时绽放 作为一名热衷技术的开发者 我有幸参与了这次盛会 也非常荣幸能够和线上三十万开
  • 通信子网在计算机网络中的地位和作用

    一 通信子网是计算机网络的核心组成部分 通信子网是计算机网络的核心组成部分 它负责为计算机网络中的各种设备提供通信支持 无论是主机之间的数据传输 还是主机与终端之间的数据通信 都需要通过通信子网来实现 通信子网是连接各个设备的关键基础设施
  • 大揭秘!Python处理办公自动化的10大场景!

    知乎上有个热门问题 Python 未来会成为大众办公常用编程工具吗 在编程世界里 Python已经是名副其实的网红了 曾经一个学汉语言的研究生 问我怎么学Python 因为他们课程论文里需要用到文本分析 用Python来跑数据 我和他说 你
  • 计算机网络中的通信子网主要有哪些功能?

    计算机网络中的通信子网主要具有以下功能 负责全网的数据通信 通信子网通过使用各种通信协议和传输控制功能 能够确保数据从一台主机安全 准确地传输到另一台主机 这包括数据的封装 解封装 传输控制 差错控制等过程 完成各种网络数据的处理 转换和交
  • 计算机网络中的通信子网:架构、协议与技术简介

    在计算机网络中 通信子网是负责实现主机之间以及主机与终端之间数据传输的核心部分 它由一系列硬件设备和通信协议组成 为上层应用提供可靠 高效和透明的数据传输服务 本文将详细介绍通信子网的架构 协议与技术 一 通信子网的架构 星型拓扑 星型拓扑
  • Python爬虫是否合法?

    Python爬虫是否合法的问题颇具争议 主要涉及到使用爬虫的目的 操作方式以及是否侵犯了其他人的权益 本文将介绍Python爬虫的合法性问题 并提供一些相关的法律指导和最佳实践 1 什么是Python爬虫 Python爬虫是一种自动化程序
  • 学python如何办公自动化?学这些就够了

    我们天天都在忙 究竟在忙些什么 查找各种文件 在一个个文件夹里来回穿梭 在TXT XLS XLSX DOC DOCX PPT PDF文档之间来回切换 复制 粘贴 运指如飞 打开几十个网页 以便及时获取信息 将各种数据输入系统 以及把数据填写
  • 超实用!34 个 Python 自动化办公库清单!

    今天给大家分析34个常用的Python自动化办公库 本次内容涵盖了 Excel Word PPT ODF PDF 邮件 微信 文件处理等所有能在办公场景实现自动化的库 希望能够对大家有所帮助 Python Excel自动化库 1 xlwin
  • wireshark使用

    1 抓包界面介绍 2 过滤 1 ip过滤 or 端口过滤 ip src 192 168 1 104 显示源地址为192 168 1 104的数据包列表 ip dst 192 168 1 104 显示目标地址为192 168 1 104的数据
  • 如何自学成 Python 大神?这里有些建议

    人生苦短 我用 Python 为什么 简单明了的理由当然是开发效率高 但是学习 Python 的初学者往往会面临以下残酷的现状 网上充斥着大量的学习资源 书籍 视频教程和博客 但是大部分都是讲解基础知识 不够深入 也有的比较晦涩 难以理解
  • 这或许是最全的 Python 数据分析指南(全)

    因工作需求经常会面试一些数据分析师 一些 coding 能力很强的小伙伴 当被问及数据分析方法论时一脸懵逼的 或者理所当然的认为就是写代码啊 在文章开头先来解释一下数据分析 数据分析是通过明确分析目的 梳理并确定分析逻辑 针对性的收集 整理
  • Python爬虫入门(一)

    前言 很多人都或多或少听说过 Python 爬虫 我也一直很感兴趣 所以也花了一个下午入门了一下轻量级的爬虫 为啥是轻量级的爬虫呢 因为有的网页是比较复杂的 比如需要验证码 登录验证或者需要证书才能访问 我们了解爬虫的概念和架构 只需要做一
  • Python爬虫 (适合初学者)

    关于爬虫是什么 怎样保证爬虫的合法性小编在这就不再过多的阐述 从本章起 小编将和大家一起分享在学习python爬虫中的所学 希望可以和大家一起进步 也希望各位可以关注一下我 首先我们来初步了解下如何使用开发者工具进行抓包 以 https f
  • std::iota 函数简单使用

    std iota 是 C 标准库中的一个算法 位于
  • LeetCode-周赛-思维训练-中等难度

    第一题 1798 你能构造出连续值的最大数目 解题思路 我们先抛开原题不看 可以先完成一道简单的题目 假设现在就给你一个目标值X 问你能够构造出从 1 X 的连续整数 最小需要几个数 贪心假设 期望 我们要尽量用最少的数目 构造出最长的连续
  • Django系列之Celery异步框架+RabbitMQ使用

    在Django项目中 如何集成使用Celery框架来完成一些异步任务以及定时任务呢 1 安装 pip install celery celery框架 pip install django celery beat celery定时任务使用 p
  • LeetCode-数组-重叠、合并、覆盖问题-中等难度

    435 无重叠区间 我认为区间类的题型 大多数考验的是思维能力 以及编码能力 该类题型本身并无什么算法可言 主要是思维逻辑 比如本题实际上你只需要能够总结出重叠与不重叠的含义 再加上一点编码技巧 便可完成 解题思路 正如前面所说 那么解题的