当前位置: 首页 > news >正文

合并区间-leetcode

题目描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

示例 3:

输入:intervals = [[4,7],[1,4]]
输出:[[1,7]]
解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

解法一

思路:

受到大佬启发,采用布尔数组进行求解,创建一个大的布尔数组,然后读取每个数组,对数组确定的边界内的布尔值置为true。第一个问题:如果输入为[[1,4],[5,6]]这样我们输出的结果应该为[1,6],但是实际应该为[[1,4][5,6]]。第二个问题:输入为[[1,4],[0,0]]时,只会输出[1,4]

解决方法:受到大佬启发,将布尔数组扩大1倍,同时填充时也扩大一倍。输入为[[1,4],[5,6]],填充为[[2,8],[10,12]],此时中间有9间隔。输入为[[1,4],[0,0]],填充为[[2,8],[0,0]],此时0被填充了,原因:填充操作Arrays.fill(nums,start,end+1,true)会填充从startend,包括startend[0,0]填充为Arrays.fill(nums,0,1,true)

代码:

class Solution {public int[][] merge(int[][] intervals) {List<int[]> segments = new ArrayList<>();int l=Integer.MAX_VALUE,r=Integer.MIN_VALUE;for(int i=0;i<intervals.length;i++){int start=intervals[i][0],end=intervals[i][1];l=Math.min(l,start);r=Math.max(r,end);}boolean[] nums=new boolean[(r-l+1)*2];for(int i=0;i<intervals.length;i++){int start=intervals[i][0],end=intervals[i][1];Arrays.fill(nums,(start-l)*2,(end-l)*2+1,true);}int i=0;while(i<=(r-l)*2){if(nums[i]){int start=i/2;while (i <=(r-l)*2 && nums[i]) {i++;}int end = i/2;segments.add(new int[]{start+l,end+l});}elsei++;}return segments.toArray(new int[segments.size()][]);}
}

解法二

思路:

官方解法。如果我们按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的。如下图所示,标记为蓝色、黄色和绿色的区间分别可以合并成一个大区间,它们在排完序的列表中是连续的:

1

我们用数组 merged 存储最终的答案。

首先,我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入 merged 数组中,并按顺序依次考虑之后的每个区间:

  • 如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组 merged 的末尾;

  • 否则,它们重合,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点,将其置为二者的较大值。

代码:

class Solution {public int[][] merge(int[][] intervals) {if (intervals.length == 0) {return new int[0][2];}Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] interval1, int[] interval2) {return interval1[0] - interval2[0];}});List<int[]> merged = new ArrayList<int[]>();for (int i = 0; i < intervals.length; ++i) {int L = intervals[i][0], R = intervals[i][1];if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {merged.add(new int[]{L, R});} else {merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);}}return merged.toArray(new int[merged.size()][]);}
}
http://www.hskmm.com/?act=detail&tid=7573

相关文章:

  • 两种判断计算机大小端模式的方法
  • ROS2之节点
  • 9.17日总结
  • ECT-OS-JiuHuaShan 框架,元推理AGI奇迹
  • Mapper与Mapper.xml的关系
  • Rocky Linux10.0安装zabbix7.4详细步骤 - 教程
  • 【P3158】放棋子 - Harvey
  • 最强AI语音克隆和文本配音工具!与真人无异,CosyVoice下载介绍
  • 近日C++线上练习结果
  • 密力根油滴实验实验报告
  • Linux 系统插入U盘/移动硬盘实现自动挂载
  • 来点人瑞平我
  • 日总结 2
  • 概率论第一章部分习题
  • 日常 3
  • 【P2051】中国象棋 - Harvey
  • JavaDay6
  • Ubuntu Linux 云服务器常见安全漏洞修复方法汇总 Apache/OpenSSH/DNS
  • 多个 root 用户记录,而且有些记录的密码是空的,导致认证混乱。
  • Min-Max 容斥小记
  • 【POJ1737】Connected Graph - Harvey
  • AI智能体开发实战:从提示工程转向上下文工程的完整指南
  • 解码C语言九条语句
  • 某交互题选讲的补题记录
  • openwrt ipv6 NAT6配置
  • 奶龙抽象语录
  • 解题报告-P11670 [USACO25JAN] Cow Checkups S
  • word vba 对 带编号格式的PO单 段落下添加对应的图片
  • 解题报告-P11671 [USACO25JAN] Farmer Johns Favorite Operation S
  • 解码C语言运算符