力扣经典150题第四十八题:合并区间

news/2024/10/18 18:14:19/

目录

      • 题目描述和要求
      • 示例解释
      • 解题思路
      • 算法实现
      • 复杂度分析
      • 测试和验证
      • 总结和拓展
      • 参考资料

题目描述和要求

给定一个数组 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] 可被视为重叠区间。

解题思路

我们可以对区间按照起始位置进行排序,然后依次遍历每个区间,合并重叠的区间。具体步骤如下:

  1. 对区间按照起始位置进行排序。
  2. 初始化一个结果列表,用于存储合并后的区间。
  3. 遍历排序后的区间,如果当前区间与结果列表中最后一个区间重叠,则更新最后一个区间的结束位置;否则,将当前区间加入结果列表。
  4. 返回结果列表。

算法实现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class MergeIntervals {public int[][] merge(int[][] intervals) {if (intervals == null || intervals.length == 0) {return new int[0][];}Arrays.sort(intervals, (a, b) -> a[0] - b[0]);List<int[]> merged = new ArrayList<>();for (int[] interval : intervals) {if (merged.isEmpty() || merged.get(merged.size() - 1)[1] < interval[0]) {merged.add(interval);} else {merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], interval[1]);}}return merged.toArray(new int[merged.size()][]);}
}

复杂度分析

  • 时间复杂度:O(nlogn),其中 n 为区间的数量。排序的时间复杂度为 O(nlogn),遍历一次区间的时间复杂度为 O(n)。
  • 空间复杂度:O(logn)~O(n),取决于排序的实现方式和额外空间的使用情况。

测试和验证

编写测试用例对算法进行验证,确保其正确性和健壮性。

public class Main {public static void main(String[] args) {MergeIntervals mergeIntervals = new MergeIntervals();int[][] intervals1 = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};System.out.println(Arrays.deepToString(mergeIntervals.merge(intervals1))); // [[1,6],[8,10],[15,18]]int[][] intervals2 = {{1, 4}, {4, 5}};System.out.println(Arrays.deepToString(mergeIntervals.merge(intervals2))); // [[1,5]]}
}

总结和拓展

本题通过对区间按照起始位置进行排序,然后合并重叠的区间,实现了对给定区间的合并操作。这个算法思路清晰简单,在处理类似问题时是一个不错的选择。

此外,我们也可以考虑其他方法实现区间合并,例如使用栈或递归等方式,来实现同样的功能。

参考资料

  • 《力扣经典150题》
  • LeetCode 官方网站

http://www.ppmy.cn/news/1443213.html

相关文章

数据分析-----方法论

什么是数据分析方法 数据分析方法&#xff1a;将零散的想法和经验整理成有条理的、系统的思路&#xff0c;从而快速地解决问题。 案例&#xff1a; 用户活跃度下降 想法&#xff1a; APP出现问题&#xff1f;去年也下降了吗&#xff1f;是所有的人群都在下降吗&#xff1f…

CentOS 删除文件提示 Operation not permitted 的解决方法

1、阿里云服务器提示存在挖矿行为&#xff0c;路径在 /etc/zzh&#xff0c;我们做下删除动作&#xff0c;发现不能删除 [rootMSH etc]# rm -f zzh# 提示 rm: cannot remove ‘zzh’: Operation not permitted2、解决方法&#xff1a; (1)、查看文件权限 [rootMSH etc]# lsat…

am62x Ti官方资源一览

文章目录 1 Ti-Am62x Resource Explorer使用一 官方介绍二 资料查询1 AM62x芯片文档2 SK-AM62X参考板3 SD卡镜像4开发SDK5 Linux开发6 问题提问1 Ti-Am62x Resource Explorer使用 一 官方介绍 打开主页,最左侧显示如下,当前分为7大类 Arm@-based microcontrollers Arm系列微…

【python技术】使用akshare抓取东方财富所有概念板块,并把指定板块概念的成分股保存excel 简单示例

最近有个想法&#xff0c;分析A股某个概念成分股情况进行分析&#xff0c;第一反应是把对应概念板块的成分股爬取下来。说干就干 下面是简单示例 import akshare as ak import pandas as pddef fetch_and_save_concept_stocks(name):# 获取指定股票概念的成分股&#xff0c;并…

Qt Creator导入第三方so库和jar包——Qt For Android

前言 之前了解了在Android Studio下导入so库和jar包&#xff0c;现在实现如何在Qt上导入so库和jar包。 实现 下面是我安卓开发&#xff08;需调用安卓接口的代码&#xff09;的目录&#xff08;图1&#xff09;&#xff0c;此目录结构和原生态环境&#xff08;Android Studi…

web安全---xss漏洞/beef-xss基本使用

what xss漏洞----跨站脚本攻击&#xff08;Cross Site Scripting&#xff09;&#xff0c;攻击者在网页中注入恶意脚本代码&#xff0c;使受害者在浏览器中运行该脚本&#xff0c;从而达到攻击目的。 分类 反射型---最常见&#xff0c;最广泛 用户将带有恶意代码的url打开&a…

C#发票查验开发示例、发票识别开发文档

或许有人会问&#xff0c;发票查验与发票识别接口是什么&#xff1f;简单来说&#xff0c;它只是集成在财务系统或APP等应用中的一个功能模块。只需上传发票图片&#xff0c;发票识别接口即可快速提取发票代码、号码、日期、金额、校验码等关键信息&#xff0c;发票查验接口实时…

STM32 单片机 GPIO 的八种工作模式是什么?

在STM32微控制器中&#xff0c;外设是其功能的核心。 GPIO&#xff08;通用输入/输出&#xff09; GPIO是STM32中最基本的外设之一&#xff0c;它允许微控制器与外部电路进行数字信号的输入和输出。每个GPIO引脚都可以配置为输入或输出&#xff0c;并可以通过软件控制其状态。…