题目描述
以数组 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 <= intervals.length <= 104
- intervals[i].length == 2
- 0 <= starti <= endi <= 104
解题方法
排序
这道题的主要目的是按区间大小排序后合并空间。
- 那我们第一步就是给区间元素排序,将左区间元素小的排到前面。
- 第二步就是我们遍历排序后的区间数组时,校验当前区间和后面区间是否重叠;若重叠,则需要合并。
完成上面两步,我们即可获取最终结果。
java代码
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] interval1, int[] interval2) {
return interval1[0] - interval2[0];
}
});
List<int[]> results = new ArrayList<>();
results.add(intervals[0]);
for(int i = 1; i < intervals.length; i++) {
int[] curInterval = results.get(results.size() - 1);
// 前面元素的右区间 < 后面元素的左区间
if (curInterval[1] < intervals[i][0]) {
results.add(intervals[i]);
} else {
// 前面元素的右区间 >= 后面元素的左区间,需要将两个区间合并
int[] interval = new int[] {curInterval[0], Math.max(curInterval[1], intervals[i][1])};
results.remove(results.size() - 1);
results.add(interval);
}
}
return results.toArray(new int[results.size()][]);
}
复杂度分析
时间复杂度:
O
(
N
l
o
g
N
)
O(NlogN)
O(NlogN),主要是快速排序需要花费的时间。
空间复杂度:
O
(
N
)
O(N)
O(N),保存最终区间结果集。
相似题目
- 个人公众号
- 个人小游戏