leetcode 56. 合并区间
问题描述: 以数组 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,右半区间赋值为1,将区间边界(左或右)排序,从小到大,若边界一样,则左边界排在右边界前面。指针相加,结果为零说明找到合并区间。
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function(intervals) {
let arr=[];
for(let i=0;i<intervals.length;i++){
arr.push([intervals[i][0],-1])
arr.push([intervals[i][1],1])
}
arr=arr.sort((a,b)=>{
if(a[0]!==b[0])return a[0]-b[0];
return a[1]-b[1]
})
let pre=-1,sum=0;
let res=[];
console.log(arr)
for(let i=0;i<arr.length;i++){
if(pre==-1)pre=arr[i][0];
sum+=arr[i][1];
if(sum==0){
res.push([pre,arr[i][0]]);
pre=-1;
sum=0;
}
}
return res
};