题目描述
以数组 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] 可被视为重叠区间。
思路
- 排序:首先对区间按照起始点 (
a[0]) 进行升序排序。 - 合并区间:遍历排序后的区间,判断当前区间是否与结果数组中的最后一个区间重叠。
- 如果当前区间的起始点小于等于结果数组最后一个区间的结束点,说明两者重叠,可以合并。
- 如果不重叠,则将当前区间直接添加到结果数组中。
复杂度分析
时间复杂度
- O(n log n):主要由排序步骤决定,排序需要
O(n log n)时间。 - O(n):遍历区间进行合并的过程需要
O(n)时间。 - 总时间复杂度:
O(n log n),因为排序的时间复杂度主导整体复杂度。
空间复杂度
O(n):在最坏情况下(所有区间互不重叠),结果数组 res 需要存储所有 n 个区间
code
var merge = function(intervals) {
intervals.sort((a, b) => a[0] - b[0])
const res = [intervals[0]]
let len = 0
for(let i = 1; i < intervals.length; i++){
let item = intervals[i]
if(item[0] <= res[len][1] && item[1] >= res[len][1]){
res[len][1] = item[1]
}else if(item[0] > res[len][1]){
res.push(item)
len++
}
}
return res
};