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

文章目录

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

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

重叠区间: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]);}
}

解法2——在原数组上合并再加入答案

class Solution {
public://原数组上直接合并的写法static bool cmp(vector<int>&a,vector<int>&b){if(a[0]<b[0]) return true;                      //左边界升序排序return false;}vector<vector<int>>result;vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(), cmp);    for(int i = 1; i < intervals.size(); i++){if(intervals[i][0] > intervals[i-1][1]){    //完全不重叠//把i-1放进去,而不是iresult.push_back(intervals[i-1]);} else if(intervals[i][0] <= intervals[i-1][1]){//更新intervals[i]intervals[i][1] = max(intervals[i-1][1], intervals[i][1]);intervals[i][0] = min(intervals[i-1][0], intervals[i][0]);}}result.push_back(intervals[intervals.size() - 1]);return result;}
};

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

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

相关文章

excel中函数vlookup使用方法

1、VLOOKUP函数是Excel中的一个纵向查找函数&#xff0c;它与 LOOKUP函数和 HLOOKUP函数属于一类函数&#xff0c;在工作中都有广泛应用。VLOOKUP是按列查找&#xff0c;最终返回该列所需查询列序所对应的值&#xff1b;与之对应的HLOOKUP是按行查找的。接下来以5位同学成绩表为…

macOS Sonoma 14beta 3(23A5286g)发布(附黑/白苹果镜像地址)

系统镜像下载&#xff1a;百度&#xff1a;黑果魏叔 系统介绍 黑果魏叔 7 月 6 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 3 更新&#xff08;内部版本号&#xff1a;23A5286g&#xff09;&#xff0c;本次更新距离上次发布隔了 14 天。 小…

mqadmin命令的使用

mqadmin命令的使用 F:\rocketmq-all-4.9.7-bin-release\bin>mqadmin The most commonly used mqadmin commands are: updateTopic Update or create topic deleteTopic Delete topic from broker and NameServer. updateSubGroup Update or create subscription group delet…

vue3脚本绑定CodeMirror的使用

代码&#xff1a; <template><CodeMirrorref"codeMirror":value"codeVal":languageSingle"languageSingle":readOnly"!isEdit"submitCode"submitCode"></CodeMirror> </template><script setup…

SpringBoot+Vue 的在线考试系统

&#x1f495;&#x1f495;作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&…

Maven高级(二)--继承与版本锁定

一.继承 1.目的&#xff1a;不同模块中经常需要用到同一个依赖&#xff0c;这样要在每个pom.xml中都引入对应的坐标&#xff0c;继承可以用来解决依赖引入重复的问题。 2.实现&#xff1a;我们可以在创建一个父工程&#xff0c;然后将多个模块来继承这个父工程。然后再将各个模…

0代码训练GPT-5?MIT微软证实GPT-4涌现自我纠错能力迭代

我们都知道&#xff0c;大模型具有自省能力&#xff0c;可以对写出的代码进行自我纠错。 这种自我修复背后的机制&#xff0c;究竟是怎样运作的&#xff1f; 对代码为什么是错误的&#xff0c;模型在多大程度上能提供准确反馈&#xff1f; 近日&#xff0c;MIT和微软的学者发…

了解Spring

目录 什么是Spring? DI Spring 存与取 spring 的存操作 spring的取操作 更快速的进行 Spring 存 与 读 三大注入方式 Autowired set 注入 构造方法注入 Spring 容器中有多个相同的类时 Bean 作用域 设置作用域 Spring 执行流程 Bean 生命周期 什么是Spring? Sp…

uniapp 发送全文件 支持App端ios、android,微信小程序,H5

由于uniapp提供的API在app端只能上传图片和视频&#xff0c;不能上传其他文件&#xff0c;说以只能借助插件了。 ios端用的这个插件 获取到文件对象 免费的 这个是返回一个 filePath 可用直接用于 uni.uploadFile 上传的路径&#xff0c;后面自己又改的File对象 全文件上传选择…

【leetcode】15.三数之和(python+转为两数之和+去重)

class Solution(object):def threeSum(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""# 思路&#xff1a;转为两数之和# for循环遍历先固定一个数字a&#xff0c;寻找另外两个数字之和-a&#xff08;双指针&#xff09;# 难点…

C#基础学习_字段与属性的比较

C#基础学习_字段与属性的比较 字段: 字段主要是为类的内部做数据交互使用,字段一般是private修饰; 字段可以赋值也可以读取; 当需要为外部提供数据的时候,请将字段封装为属性,而不是使用公有字段,这是面对对象编程所提倡的。 //字段:学号private int studentID;属性: …

Redis 持久化

持久化结构图示 官网地址&#xff1a;https://redis.io/docs/management/persistence/ RDB (Redis DataBase) RDB&#xff08;Redis 数据库&#xff09;&#xff1a;RDB 持久性以指定的时间间隔执行数据集的时间点快照。 是什么 在指定的时间间隔&#xff0c;执行数据集的时间…