写在前面
有些日子没刷题了,突然一刷,玛德,惊出一身冷汗
题目
以数组 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] 可被视为重叠区间。
题解
首先要对区间首数字排序,然后分三类处理
- 不相交
- 相交(相交的情况,因为先排序了,所以相交情况变成一种了)
- 包含
题目比较关键的一点:如果相交,要pop前面的值,压入新的合并值,prev也变成合并的值
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function(intervals) {
let ans=[]
intervals.sort((a,b)=>{
return a[0]-b[0]
})
let i=0,prev=null
while(i<intervals.length){
let current=intervals[i]
if(prev){
// 不相交
if(current[0]>prev[1]){
ans.push(current)
prev=current
i++
continue
}
// 相交
if(current[1]>prev[1]){
let data=[prev[0],current[1]]
ans.pop()
ans.push(data)
prev=data
i++
continue
}
// 包含
i++
}else{
ans.push(current)
prev=current
i++
}
}
return ans
};