"Do not wait to strike till the iron is hot; but make it hot by striking." - William Butler Yeats
1. 题目描述
2. 题目分析与解析
2.1 思路一
还是先来分析题目,观察一下重叠的区间和不重叠的区间数组之间的关系是什么:
比如区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6],我们很容易发现第一个区间 [1,3] 的尾部
和第二个区间 [2,6]的头部
应该是前者更大或者相等
的关系(如区间 [1,4] 和 [4,5] 可被视为重叠区间)。
所以我们是不是就可以两两遍历区间,对比前一个区间的尾部和后一个区间的头的大小关系,从而达到合并区间的目的。但是我们需要注意一下:题目并没有告诉我们区间都是像下面这样:
按照所有的区间头是有序排列的(1<2<8<15)。因为只有有序的前提下才能按照上述方式求解,比如对于下面的 intervals
头部元素无序排列:
这时如果再按照上诉思路求解,那么再索引 0,1
进行比较时会出现形成区间 [2,3]
的情况。
所以我们的代码思路如下:
-
对intervals按照每一个区间的头部元素进行从小到大排序
-
遍历每一个区间,查看当前区间尾与下一个区间头的大小
-
如果前者大于等于后者,就需要合并区间,并将合并后的结果加入结果集
-
如果前小于后者,那么就不需要合并区间,将前一个区间加入结果集(因为当前区间可能和后一个区间合并)
-
-
返回结果集
注意1:对于合并的情况,并不一定是两两合并,还可能多个区间合并,就比如下面的情况:
第一次合并:
第二次合并:
第三次合并:
所以合并的结果可能和下一个区间合并,这一点要在代码中体现出来。
注意2:对于最后一个元素的处理,因为我们是比较的当前区间和下一个区间,所以要防止数组越界,就需要对最后一个区间分为两种情况处理:
-
如果倒数第二个区间能够将最后一个区间合并,那么就会在合并部分的while循环中
i等于intervals.length-1
时就可以结束遍历了 -
如果倒数第二个区间不能将最后一个区间合并,那么就会在
i等于intervals.length-1
时把最后一个区间加入结果集结束遍历
3. 代码实现
4. 相关复杂度分析
时间复杂度
-
排序:首先,对区间数组
intervals
进行排序,时间复杂度为O(n log n),其中n
是intervals
的长度。 -
遍历并合并区间:之后,通过一次遍历来合并区间,时间复杂度为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)。