以数组
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].
解法1 排序+
思路
合并两个区间其实就是在看他们有没有交集。如何看判断是否有交集呢:左区间的右端点大于等于右区间的左端点。而这一条件需要左区间和右区间是有序排列,如果不是则会出现其他情况。所以首先第一步需要对这个数组按第一位进行排序。之后来比较区间的端点,如果有交集,则加入到答案中去。
代码
function merge(intervals: number[][]): number[][] {
if (intervals.length == 0) {
return [];
}
intervals.sort((a, b) => a[0] - b[0]);
const merged: number[][] = [];
// 初始化第一个区间
let currentInterval = intervals[0];
for (let i = 1; i < intervals.length; i++) {
const nextInerval = intervals[i];
// 如果当前区间的结束值大于等于下一个区间的开始值,说明有重叠
if (currentInterval[1] >= nextInerval[0]) {
// 合并区间,取最大结束值
currentInterval[1] = Math.max(nextInerval[1], currentInterval[1]);
} else {
// 如果没有重叠,将当前区间加入结果数组,更新当前区间
merged.push(currentInterval);
currentInterval = nextInerval;
}
}
// 添加最后的区间
merged.push(currentInterval);
return merged;
};
时空复杂度分析
时间复杂度:排序开销 O(n logn),遍历 O(n),所以总的时间复杂度是O(n logn)
空间复杂度:如果把结果算上空间开销是 O(n),额外的排序空间开销是 O(logn)