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

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]

输出:[[1,6],[8,10],[15,18]]

解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]


这个题的目标是合并所有重叠的区间。解题思路是,先把数组的元素进行排序,再合并区间。

为什么要排序呢?因为将区间按照起始元素排序,才能让我们非常清晰地识别重叠的区间。

排序:首先,根据每个区间的起始元素对区间进行排序(按照首元素从小到大排)。

合并:然后,遍历排序后的区间列表,检查当前区间是否与前一个区间重叠。 如果重叠,合并这两个区间;如果不重叠,将当前区间添加到结果列表中。

具体步骤:

  1. 排序:使用 Arrays.sort 方法对区间进行排序,排序的依据是每个区间的起始元素大小。

  2. 合并:使用一个 LinkedList 来存储合并后的区间。遍历排序后的区间列表,对于每个区间,检查它是否与 LinkedList 中最后一个区间重叠。如果重叠,合并这两个区间;如果不重叠,将当前区间添加到 LinkedList 中。

  3. 返回结果:将 LinkedList 转换为数组并返回。

我的Java代码:

class Solution {
public int[][] merge(int[][] intervals) {
if (intervals.length <= 1) {
return intervals;
} // 按照首元素对区间进行排序。 lambda 表达式定义排序的规则:首元素小的区间排在前面。
Arrays.sort(intervals, (a, b) -> a[0] - b[0]); LinkedList<int[]> merged = new LinkedList<>();
merged.add(intervals[0]);
int length = intervals.length; for (int i = 1; i < length; i++) {
int[] current = intervals[i];
int[] lastMerged = merged.getLast(); // 检查当前区间是否与最后一个合并的区间重叠
if (current[0] <= lastMerged[1]) {
// 合并区间
lastMerged[1] = Math.max(lastMerged[1], current[1]);
} else {
// 不重叠,将当前区间添加到结果列表中
merged.add(current);
}
} return merged.toArray(new int[merged.size()][]);
}
}

Java 解算法:合并区间的更多相关文章

  1. Java经典算法四十例编程详解+程序实例

    JAVA经典算法40例 [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   1.程 ...

  2. Java实现 蓝桥杯 算法训练 区间k大数

    算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二 ...

  3. Java与算法之(11) - 合并排序

    天下事,合久必分,分久必合.合并排序的基本思想正是先分再合. 例如对3, 1这个数列排序,首先是分,分为3和1两个数列,然后再合并并排序.合并需要额外的辅助空间,即建立一个两个数列长度之和的空数组用于 ...

  4. C#与java中的AES加解密互解算法

    一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string va ...

  5. Java实现 LeetCode 56 合并区间

    56. 合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...

  6. 【LeetCode】数组--合并区间(56)

    写在前面   老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...

  7. [LeetCode] Merge Intervals 合并区间

    Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8, ...

  8. 使用Java练习算法常用的基本操作

    一.使用Java练习算法常常需要使用控制台的数据输入和输出,下面记录一下基本的使用方法: 基本用法 import java.util.*; public class Main { public sta ...

  9. JAVA经典算法40题及解答

    JAVA经典算法40题 [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分 ...

  10. JAVA经典算法40题

    1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...

随机推荐

  1. 双向 和 多重 RNN

    前面已经对 RNN (递归神经网络) 的变体 (主要为解决 梯度消失和梯度爆炸) 接触了两个比较流行的 LSTM 和 GRU, 其核心思想呢, 是通过其所谓 **"gate" ** ...

  2. TVM: VisitExpr流程分析

    TVM源码中涉及到表达式遍历的地方,一般是适用VisitExpr接口进行,这个接口设计TVM的visitor模式,具体分析可参考:TVM:visitor设计模式 基类tvm::relay::ExprF ...

  3. WPF中Resx文件中添加Byte[]

    参考:https://learn.microsoft.com/zh-tw/dotnet/api/system.resources.resxresourcewriter.generate?view=wi ...

  4. select * 和 select 字段的区别

    摘要:介绍 select * 和 select 字段的区别,建议各位不要使用 select * .   在千万级表中查询数据的时候,需要千方百计提升查询效率,为用户带来最爽的体验:业界各位大佬都提到 ...

  5. 面试题:java Runnable与Callable 的区别

    相同点 都是接口:(废话,当然是接口了) 都可用来编写多线程程序: 都需要调用Thread.start()启动线程. Callable是类似于Runnable的接口,实现Callable接口的类和实现 ...

  6. Java 多个线程之间共享数据

    线程执行的代码相同    如果每个线程执行的代码相同,可以使用同一个Runnable对象,在这个Runnable对象中定义共享数据即可,例如,卖票系统就可以这么做. public class Sell ...

  7. CentOS7 vsftpd服务搭建与详解

    FTP介绍 文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件.上传文件.下载文件. FTP 基于TCP协议生成一个虚拟的连接,主要用 ...

  8. stylus - 新生代CSS预处理框架

    stylus是什么 Stylus 是一种 CSS 预处理器,它扩展了 CSS 的功能,使得编写样式变得更简洁和高效.Stylus 允许使用嵌套.变量.混入等编程功能,这些功能可以极大地提高开发效率和代 ...

  9. Istio流量控制

    Istio 是现在最热门的 Service Mesh 工具,istio 是由 Google.IBM.Lyft 等共同开源的 Service Mesh(服务网格)框架,于2017年初开始进入大众视野.K ...

  10. 一文读懂HyperWorks的耦合求解功能

    Altair Engineering, Inc. 是世界领先的工程设计技术开发者,同时,也是一家具有全球深厚工程技术底蕴的优秀CAE工程咨询公司.Altair公司在CAE建模.有限元分析.可视化.结构 ...