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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学生备考使用台灯到底好不好?公认好用的护眼台灯推荐

在现代生活中&#xff0c;许多学生的学习压力越来越大&#xff0c;面临的近视几率也越来越大&#xff0c;特别是初中生&#xff0c;眼睛发育还未完全&#xff0c;使用不恰当的灯光也会对眼睛造成损害&#xff0c;特别是护眼台灯。虽然护眼台灯在功能上能够提供充足、柔和的光线…

【投稿优惠|检索稳定】2024年信息系统、工程与数字化经济国际会议(ICISEDE 2024)

2024年信息系统、工程与数字化经济国际会议(ICISEDE 2024) 2024 International Conference on Information Systems and Engineering and the Digital Economy(ICISEDE 2024) [会议简介] 2024 年信息系统、工程与数字化经济国际会议(ICISEDE 2024)将于 2024 年 1 月 20 日在厦门…

Docker 部署 2FAuth 服务

拉取最新版本的 2FAuth 镜像&#xff1a; $ sudo docker pull 2fauth/2fauth:latest在本地预先创建好 2fauth 目录, 用于映射 2FAuth 容器内的 /2fauth 目录。 使用以下命令, 在 前台 运行 2FAuth 容器: $ sudo docker run -it --rm --name 2fauth -p 10085:8000/tcp -v /ho…

【漏洞复现】FLIR AX8红外线热成像仪命令执行漏洞

漏洞描述 eledyne FLIR 设计、开发、制造以及强大的传感和意识技术。自透射热图像、可见光图像、可见频率分析、来自测量和诊断的先进威胁测量系统以及日常生活的创新解决方案。 Teledyne FLIR 提供多种产品用于政府、国防、工业和商业市场。我们的产品,紧急救援人员,军事人…

SAP UI5 walkthrough step9 Component Configuration

在之前的章节中&#xff0c;我们已经介绍完了MVC的架构和实现&#xff0c;现在我们来讲一下&#xff0c;SAPUI5的结构 这一步&#xff0c;我们将所有的UI资产从index.html里面独立封装在一个组件里面 这样组件就变得独立&#xff0c;可复用了。这样&#xff0c;无所什么时候我…

基于物联网的智能仓管理系统方案

基于物联网的智能仓管理系统方案 一、项目背景 随着企业业务的快速发展&#xff0c;传统的人工仓库管理方式已经无法满足现代企业的需求。仓库运营效率低下、货物出入库错误、库存不准确等问题不断涌现。因此&#xff0c;我们提出一个基于物联网技术的智能仓管理系统方案&…

3DMAX UV贴图修改插件安装卸载方法

3DMAX UV贴图修改插件安装卸载方法 3dMax贴图修改插件PolyUnwrapper是为纹理艺术家设计的一整套专业工具&#xff0c;尤其适用于建筑和游戏行业。 它包含许多功能&#xff0c;将大大帮助您改进UV展开的工作流程。 【主要功能特点】 -多重缝合。一次缝合多个壳 -自定义打包算…

基于ssm志愿者招募网站源码和论文

网络的广泛应用给生活带来了十分的便利。所以把志愿者招募管理与现在网络相结合&#xff0c;利用java技术建设志愿者招募网站&#xff0c;实现志愿者招募的信息化。对于进一步提高志愿者招募管理发展&#xff0c;丰富志愿者招募管理经验能起到不少的促进作用。 志愿者招募网站…

Premiere Pro 2024 新功能有哪些?视频剪辑软件PR2024更新内容及问题修复

PR软件“基于文本的编辑”中的填充词检测与批量删除功能 “基于文本的编辑”可让您检测“呃”和“嗯”填充词并批量删除它们&#xff0c;从而使您的转录文本更加准确。就像处理停顿一样&#xff0c;您可以单击填充词并将其从序列转录文本中删除。填充词与语言无关&#xff0c;…

高通CRM的v4l2驱动模型

概述下crm中v4l2框架的初始化创建流程&#xff1a; 对于CRM主设备的v4l2框架创建过程&#xff1a; 1、分配和初始化v4l2 device对象 2、分配和初始化media device对象&#xff0c;然后将v4l2 device中mdev绑定到media device上 3、分配和初始化video device对象&#xff0c…

基于OpenCV的人脸识别系统案例

基于OpenCV的人脸识别系统案例 人脸识别简介代码实现案例应用情况 下面将介绍如何使用Python和OpenCV库构建一个简单但强大的人脸识别系统。人脸识别是计算机视觉领域的一个重要应用&#xff0c;具有广泛的实际用途&#xff0c;从安全门禁到娱乐应用。 人脸识别简介 人脸识别是…

在微信小程序中如何改变默认打开的页面

在微信小程序中&#xff0c;在我们编写页面的时候&#xff0c;可能会在重新渲染的时候导致页面跳转到默认打开的页面上&#xff0c;为了提升用户的一个体验&#xff0c;我们可以设置一些内容来修改小程序默认打开的页面&#xff0c;提升开发者的开发体验。 当我们打开一个微信…

字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现

文章目录 &#x1f680;前言&#x1f680;库函数strlen✈️strlen的模拟实现 &#x1f680;库函数strcpy✈️strcpy的模拟实现 &#x1f680;strcmp✈️strcmp的模拟实现 &#x1f680;strstr✈️strstr的模拟实现 &#x1f680;strcat✈️strstr的模拟实现 &#x1f680;前言 …

模型能力赋能搜索——零样本分类(Zero-Shot Classification)在搜索意图识别上的探索

什么是Zero-Shot Classification https://huggingface.co/tasks/zero-shot-classification hugging face上的零样本分类模型 facebook/bart-large-mnli https://huggingface.co/facebook/bart-large-mnli 当然这是一个英文模型&#xff0c;我们要去用一些多语言的模型。 可以在…

单片机双机通信控制跑马灯

实验要求 两个单片机各驱动8个LED灯&#xff0c;构成两个跑马灯&#xff0c;要求甲单片机LED的点亮方式是从上至下&#xff0c;首先是最上面第一个点亮、其次是前两个点亮、其次是前三个点亮……直至8个灯全部点亮&#xff0c;8个灯全部灭&#xff0c;重复这个过程&#xff0c…

MTU与MSS

MTU&#xff1a;一个网络包的最大长度&#xff0c;以太网中一般为1500各字节。 MSS&#xff1a;除去头部之后&#xff0c;一个网络包所能容纳的TCP数据的最大长度。 应用程序调用write后&#xff0c;将要发送的数据被交给TCP/IP协议栈进行。 协议栈不关心应用的数据内容&…

使用Microsoft Dynamics AX 2012 - 5. 生产控制

生产控制的主要职责是生产成品。为了完成这项任务&#xff0c;制造业需要消耗物品和资源能力&#xff08;人员和机械&#xff09;。制造过程可能包括半成品的生产和库存。半成品是指物品包括在成品材料清单中。 制造业的业务流程 根据公司的要求&#xff0c;您可以选择申请Dy…

三星有一个特有的重置电脑的应用程序,方便快捷,那就是三星恢复

本文介绍如何将三星笔记本电脑重置为出厂设置。它涵盖了两种方法,它们都适用于Windows 11和Windows 10。 如何用“三星恢复(Samsung Recovery)”重置三星笔记本电脑 许多三星笔记本电脑附带一种名为“三星恢复”的实用程序。这是一个比Windows“重置此电脑”过程更快、更不…

枚举 LeetCode2048. 下一个更大的数值平衡数

如果整数 x 满足&#xff1a;对于每个数位 d &#xff0c;这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。 给你一个整数 n &#xff0c;请你返回 严格大于 n 的 最小数值平衡数 。 如果n的位数是k&#xff0c;n它的下一个大的平衡数一定不会超过 k1个k1…

插入排序与希尔排序(C语言实现)

1.插入排序 由上面的动图可以知道插入排序的逻辑就是从第一个元素开始往后遍历&#xff0c;如果找到比前一个元素小的&#xff08;或者大的&#xff09;就往前排&#xff0c;所以插入排序的每一次遍历都会保证前面的数据是有序的&#xff0c;接下类用代码进行讲解。 我们这里传…