【算法】区间合并类题目总结

news2024/11/18 1:25:17

文章目录

  • 重叠区间:452. 用最少数量的箭引爆气球
    • 解法1——左边界排序
    • 解法2——右边界排序
  • 无重叠区间:435. 无重叠区间
    • 解法1——左边界排序
    • 解法2——右边界排序
  • 合并区间:56. 合并区间
    • 左边界排序
    • 这题为什么不能按照右边界排序?
      • 其实右边界排序也是可以写的!

本文内容包括 重叠区间、不重叠区间、合并区间 的 左边界排序、右边界排序 方法。

重叠区间:452. 用最少数量的箭引爆气球

452. 用最少数量的箭引爆气球
在这里插入图片描述

解法1——左边界排序

按照左边界升序排序,在枚举的过程中只需要检查新来的左边界与旧的右边界的关系并更新最小右边界。

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (o1, o2) -> {
            return Integer.compare(o1[0], o2[0]);   //按左边界排序
        });
        int ans = 1, n = points.length, last = points[0][1];
        for (int i = 1; i < n; ++i) {
            if (points[i][0] > last) {      // 需要一个新的弓箭
                ++ans;
                last = points[i][1];
            } else last = Math.min(last, points[i][1]); // 更新最小右边界
        }
        return ans;
    }
}

解法2——右边界排序

按照右边界排序时,只需比较新来的左边界和当前右边界的关系。(由于是按右边界排序的,因此只有需要新弓箭时才需要更新右边界。)

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (o1, o2) -> {
            return Integer.compare(o1[1], o2[1]);
        });
        int ans = 1, n = points.length, last = points[0][1];
        for (int i = 1; i < n; ++i) {
            if (points[i][0] > last) {
                ++ans;
                last = points[i][1];
            }
        }
        return ans;
    }
}

无重叠区间:435. 无重叠区间

435. 无重叠区间
在这里插入图片描述

解法1——左边界排序

按左边界排序时,每次发现重叠的时候需要更新最小右边界,依次保证每次发生重叠,保留的都是位于左侧的。

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            return a[0] - b[0];
        });
        int ans = 0, last = intervals[0][1];
        for (int i = 1; i < intervals.length; ++i) {
            if (intervals[i][0] < last) {
                ++ans;
                last = Math.min(intervals[i][1], last);
            } else last = intervals[i][1];
        }
        return ans;
    }
}

解法2——右边界排序

按照右边界排序时,只有不重叠时才需要更新右边界。(因为是按右边界排序的,因此每次保留的一定是最靠左的右边界了。)

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            return Integer.compare(a[1], b[1]);
        });
        int ans = 0, last = intervals[0][1];
        for (int i = 1; i < intervals.length; ++i) {
            if (intervals[i][0] < last) ++ans;
            else last = intervals[i][1];
        }
        return ans;
    }
}

可以看出这道题和上一题超级像!

合并区间:56. 合并区间

56. 合并区间

在这里插入图片描述

左边界排序

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            return a[0] - b[0];
        });
        List<int[]> ans = new ArrayList();
        int last = Integer.MIN_VALUE;
        for (int i = 0; i < intervals.length; ++i) {
            if (intervals[i][0] > last) {
                ans.add(new int[]{intervals[i][0], intervals[i][1]});
                last = intervals[i][1];
            } else {
                last = Math.max(last, intervals[i][1]);
                ans.get(ans.size() - 1)[1] = last;
            }
        }
        return ans.toArray(new int[ans.size()][2]);
    }
}

这题为什么不能按照右边界排序?

看这样一个样例:[[2,3],[4,5],[6,7],[8,9],[1,10]]
按照右边界排序时,最后一个区间突然可以将之前的所有区间包裹住,但是前面的 4 个区间都各不重叠无法合并。

其实右边界排序也是可以写的!

其实右边界排序也是可以写的,把左边界排序的代码全都反过来操作就可以了!

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            return a[1] - b[1];
        });
        List<int[]> ans = new ArrayList();
        int last = Integer.MAX_VALUE;
        for (int i = intervals.length - 1; i >= 0; --i) {
            if (intervals[i][1] < last) {
                ans.add(new int[]{intervals[i][0], intervals[i][1]});
                last = intervals[i][0];
            } else {
                last = Math.min(last, intervals[i][0]);
                ans.get(ans.size() - 1)[0] = last;
            }
        }
        return ans.toArray(new int[ans.size()][2]);
    }
}

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

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

相关文章

【数据结构与算法】图课后习题

题目 下面一共有七道有关图的课后习题&#xff0c;全部都是思路画图题并不是算法设计题故在此就一起列举出来了~ 1. 已知如下图所示的有向图&#xff0c;请回答下面几个问题 每个顶点的入/出度&#xff1b;邻接矩阵&#xff1b;邻接表&#xff1b;逆邻接表&#xff1b;强连通…

Hugging Face应用——图像识别

利用人工智能解决音频、视觉和语言问题。音频分类、图像分类、物体检测、问答、总结、文本分类、翻译等均有大量模型进行参考。 Eg1: 图像识别 图像分类是为整个图像分配标签或类别的任务。每张图像预计只有一个类别。图像分类模型将图像作为输入并返回有关图像所属类别的预测…

OPPO手机上怎么设置阴历或阳历生日提醒?

有不少手机用户现在使用的都是OPPO这个品牌的手机&#xff0c;并且绝大多数用户都表示OPPO手机是比较好用的&#xff0c;不过也有一部分用户在使用手机的过程中遇到了一些问题&#xff0c;例如不知道在OPPO手机上怎么设置阴历或阳历生日提醒&#xff0c;这应该怎么办呢&#xf…

基于matlab开发和评估停车场场景中的视觉定位算法(附源码)

一、前言 本示例展示了如何使用虚幻引擎模拟环境中的合成图像数据开发视觉定位系统。 获取基本事实以评估定位算法在不同条件下的性能是一项具有挑战性的任务。与使用高精度惯性导航系统或差分GPS等更昂贵的方法相比&#xff0c;不同场景下的虚拟仿真是一种经济高效的方法来获…

数字化时代,到底如何认识商业智能BI?

数字化时代&#xff0c;商业智能BI对于企业的落地应用有着巨大价值&#xff0c;逐渐成为了现代企业信息化、数字化转型中的基础建设。 我曾经看到有人在讨论过商业智能BI的部署对于企业是否有实际意义&#xff0c;现在市场的数据已经证明商业智能BI在商业世界中&#xff0c;在…

使用Docker安装RabbitMQ并实现入门案例“Hello World”

RabbitMQ官方文档&#xff1a;RabbitMQ Tutorials — RabbitMQ 一、RabbitMQ安装&#xff08;Linux下&#xff09; 你可以选择原始的方式安装配置&#xff0c;也可以使用docker进行安装&#xff0c;方便快捷&#xff01; 1. 安装docker 没有docker的先安装一下docker&#x…

谷歌和edge浏览器升级到94及以上版本后反复提示安装pageoffice客户端

原因&#xff1a;Chrome开发团队以网络安全为由&#xff0c;强推ssl证书&#xff0c;希望所有部署在公网的网站&#xff0c;全部改用https访问&#xff0c;所以最新的谷歌和edge升级到94版本后对公网上的http请求下的非同域的http请求进行了拦截&#xff0c;于是就出现了目前遇…

一分钟告诉你国内和国外的ai绘画软件哪个好

前几天&#xff0c;我在一次聚会上偶然听到朋友们谈论起创作ai绘画的问题&#xff0c;大家都很热衷于用国内的ai绘画软件来生成自己喜欢的艺术作品&#xff0c;但又不知道国内和国外的ai绘画软件哪个好。正当我们陷入无尽的思考中时&#xff0c;其中一位朋友突然站出来说&#…

【计算机网络】1.5——计算机网络的体系结构

计算机网络的体系结构 概述 计算机网络的体系结构是计算机网络及其构建所应完成功能的精确定义 考题 不属于网络体系结构所描述的内容的是 A、网络的层次 B、每层使用的协议 C、协议的内部实现细节 D、每层必须完成的功能 这些功能的「实现细节」&#xff0c;是遵守这种体系…

SPEC CPU 2017 Ubuntu 20.04 LTS cpu2017-1_0_5.iso 安装、测试 单核成绩 笔记

环境 $ gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPER/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper OFFLOAD_TARGET_NAMESnvptx-none:amdgcn-amdhsa OFFLOAD_TARGET_DEFAULT1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pk…

vue3中的computed和watch

一、computed 1. vue2和vue3中计算属性用法对比 Vue2中的计算属性 Vue2中的计算属性是通过在Vue实例的computed选项中定义函数来创建的。计算属性会根据依赖的响应式属性进行缓存&#xff0c;只有当依赖的属性发生变化时&#xff0c;计算属性才会重新求值。 举个例子&#x…

【环境配置】Conda报错 requests.exceptions.HTTPError

问题&#xff1a; conda 创建新的虚拟环境时报错 Collecting package metadata (current_repodata.json): done Solving environment: done# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<…

OpenCVForUnity(二)基本图像容器Mat

这里写目录标题 前言Mat指针引用说明存储的方式如何创建一个Mat对像 前言 今天继续学习OpenCV的基本单位Mat. 学计算机的同学都知道在计算机中,你所看到的一切其都是数据的呈现.期最底层的本质皆是0和1的构成的.当然图片,视频等等也不例外.我们用相机,扫描仪核磁共振成像等方式…

OpenAI深夜放大招,GPT4 API全面开放并弃用一系列旧模型

GPT-4 API 现已向所有付费 OpenAI API 客户开放。GPT-3.5 Turbo、DALLE 和 Whisper API 现已普遍可用&#xff0c;我们宣布了一些旧型号的弃用计划&#xff0c;这些型号将于 2024 年初退役。 ✅ GPT4 API面向付费用户开放&#xff0c;不需要再额外申请,并且具有8K上下文&#…

bash文件输入到txt文件中

bash test_bct.sh >> test.txt结果如下

WeeChat 4.0.0 正式发布

导读WeeChat (Wee Enhanced Environment for Chat) 是一款自由开源的轻量级 IRC 客户端&#xff0c;具有高度的可定制特性&#xff0c;并且可以通过脚本进行扩展。 WeeChat 支持大多数的平台和操作系统&#xff0c;例如 Linux、BSD、macOS、Debian GNU/Hurd、HP-UX、Solaris、…

全国产化适配低代码平台,政企数字化的不二选择

编者按&#xff1a;在国家政策及战略方向的指导下&#xff0c;信创产业已成为奠定中国未来发展的重要数字基础&#xff0c;而国产化则可以解决核心技术关键被“卡脖子”的问题。另一方面&#xff0c;低代码平台能够为企业加速交付业务应用&#xff0c;降低运营成本&#xff0c;…

插入排序(思路+代码)

变量&#xff1a; index &#xff1a;代表待插入数的前一个数的下标&#xff0c;依次往回找&#xff0c;找到找到结果。 indexvalue&#xff1a;代表待插入元素的值&#xff0c;找到位置之后往index1的位置插入元素 代码&#xff1a; import java.util.Arrays;public class …

【库表操作】

一、数据库Market中创建表customers 1、创建数据库 #创建数据库 mysql> create database Market; mysql> use Market;2、创建数据表 #创建数据表 mysql> create table customers(-> c_num int(11) primary key auto_increment,-> c_name varchar(50),-> c_…

iOS-配置Universal Links通用链接

1、开启Associated Domains服务 登录苹果开发者网站&#xff0c;在Certificates, Identifiers & Profiles页面左侧选择Identifiers&#xff0c;右侧选择对应的App ID&#xff0c;点击进入配置详情页&#xff0c;开启Associated Domains服务&#xff1b; 2、更新Profile文件…