面试经典150题——合并区间

发布于:2024-03-01 ⋅ 阅读:(59) ⋅ 点赞:(0)

​"Do not wait to strike till the iron is hot; but make it hot by striking." - William Butler Yeats

gray wooden dock in sea near trees at daytime

1. 题目描述

image-20240228092508784

2.  题目分析与解析

2.1 思路一

还是先来分析题目,观察一下重叠的区间和不重叠的区间数组之间的关系是什么:

比如区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6],我们很容易发现第一个区间 [1,3] 的尾部和第二个区间 [2,6]的头部应该是前者更大或者相等的关系(如区间 [1,4] 和 [4,5] 可被视为重叠区间)。

所以我们是不是就可以两两遍历区间,对比前一个区间的尾部和后一个区间的头的大小关系,从而达到合并区间的目的。但是我们需要注意一下:题目并没有告诉我们区间都是像下面这样:

image-20240228093439341

按照所有的区间头是有序排列的(1<2<8<15)。因为只有有序的前提下才能按照上述方式求解,比如对于下面的 intervals头部元素无序排列:

image-20240228093925089

这时如果再按照上诉思路求解,那么再索引 0,1进行比较时会出现形成区间 [2,3]的情况。

所以我们的代码思路如下:

  1. 对intervals按照每一个区间的头部元素进行从小到大排序

  2. 遍历每一个区间,查看当前区间尾与下一个区间头的大小

    • 如果前者大于等于后者,就需要合并区间,并将合并后的结果加入结果集

    • 如果前小于后者,那么就不需要合并区间,将前一个区间加入结果集(因为当前区间可能和后一个区间合并)

  3. 返回结果集

注意1:对于合并的情况,并不一定是两两合并,还可能多个区间合并,就比如下面的情况:

第一次合并:

image-20240228110213677

第二次合并:

image-20240228110242540

第三次合并:

image-20240228110253742

所以合并的结果可能和下一个区间合并,这一点要在代码中体现出来。

注意2:对于最后一个元素的处理,因为我们是比较的当前区间和下一个区间,所以要防止数组越界,就需要对最后一个区间分为两种情况处理:

  • 如果倒数第二个区间能够将最后一个区间合并,那么就会在合并部分的while循环中i等于intervals.length-1时就可以结束遍历了

  • 如果倒数第二个区间不能将最后一个区间合并,那么就会在i等于intervals.length-1时把最后一个区间加入结果集结束遍历

3. 代码实现

image-20240228104926055

image-20240228104907856

4. 相关复杂度分析

时间复杂度
  1. 排序:首先,对区间数组intervals进行排序,时间复杂度为O(n log n),其中nintervals的长度。

  2. 遍历并合并区间:之后,通过一次遍历来合并区间,时间复杂度为O(n)

因此,merge方法的总体时间复杂度主要由排序步骤决定,为O(n log n)

空间复杂度
  • 结果存储:使用了一个ArrayList来存储合并后的区间,其大小最多与输入数组intervals的大小相等。因此,空间复杂度为O(n)

  • 排序:排序算法可能需要额外空间,例如在Java中,Arrays.sort()对于对象数组使用的是TimSort算法,其空间复杂度为O(n)。因此,考虑到排序的空间需求,总体空间复杂度仍为O(n)

总结

时间复杂度为O(n log n),空间复杂度为O(n)

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到