题目
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思路
合并区间问题中,我们同样也可以使用双指针进行解题。
对边界进行排序,设置两个指针,一个指针savePoint=0
用以存储数据,一个指针scanPoint=1
用以扫描。
考虑以下三种情况
[1,3]
,[4,6]
,不做合并[1,4]
,[2,3]
,合并为[1,4]
[1,4]
,[3,6]
,创建新数组
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function(intervals) {
// 排序
var arr=intervals.sort((a,b)=>a[0]-b[0]);
var savePoint=0;scanPoint=1;
var res=[];
if(intervals.length===1) return [intervals[0]];
while(scanPoint<arr.length){
// 第一种情况,两者非包含但连续
if(arr[savePoint][1]<arr[scanPoint][0]){
res.push(arr[savePoint]);
}
// 第二种情况,后者被前者包含 替换下一个原数组单元
if(arr[savePoint][1]>=arr[scanPoint][1]){
arr[savePoint+1]=arr[savePoint];
}
// 第三种情况,两者有重叠部分,构建新数组,替换下一个原数组单元
if(arr[savePoint][1]>=arr[scanPoint][0]&&arr[savePoint][1]<arr[scanPoint][1]){
var newArr=[arr[savePoint][0],arr[scanPoint][1]];
arr[savePoint+1]=newArr;
}
savePoint++;
scanPoint++;
}
// 如果走到末尾,则将最后一个元素压入
if(scanPoint===arr.length){
res.push(arr[savePoint]);
}
return res
};