题目
给出一个区间的集合,请合并所有重叠的区间。
示例
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思路
将列表中的区间按照左端点升序排序
当前区间的右端点小于下一区间的左端点,那么它们不会重合,直接将这个区间加入结果集的末尾
当前区间的右端点大于等于下一区间的左端点,出现重合,合并区间
代码实现
```class Solution {
public int[][] merge(int[][] intervals) {
if (intervals.length == 0) {
return intervals;
}
//将列表中的区间按照左端点升序排序
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
List<int[]> ans = new ArrayList<>();
int[] current = intervals[0];
for (int[] interval : intervals) {
//当前区间的右端点小于下一区间的左端点,那么它们不会重合,直接将这个区间加入结果集的末尾
if (current[1] < interval[0]) {
ans.add(current);
current = interval;
}else{
//当前区间的右端点大于等于下一区间的左端点,出现重合,合并区间
current[1] = Math.max(current[1], interval[1]);
}
}
//最后一个区间
ans.add(current);
return ans.toArray(new int[0][]);
}
}
复杂度分析
-
时间复杂度: O ( log n ) O(\log n) O(logn),其中 n n n 为区间的数量。除去排序的开销,我们只需要一次线性扫描,所以主要的时间开销是排序的 O ( n log n ) O(n\log n) O(nlogn)。
-
空间复杂度: O ( log n ) O(\log n) O(logn),其中 n n n 为区间的数量。这里计算的是存储答案之外,使用的额外空间。 O ( log n ) O(\log n) O(logn) 即为排序所需要的空间复杂度。