题目
合并区间
输入:[[1, 2], [1, 5], [2, 3], [6, 8]]
输出:[[1, 5], [6, 8]
思路
典型的区间合并问题,目的是找出一堆区间里面的连续区间有多少个。
首先,可以用 sort 函数加上自定义比较规则,对各个区间做一个排序,要求优先按区间的第一位从小到大排序,第一位相同的区间按第二位从小到大排序。
然后,设置一个“上一区间”,与“当前区间”做对比,有连续区间则对该“上一区间”做更新,无连续区间则将“上一区间”存在结果里面,再将“当前区间”赋值给“上一区间”,接着向下比较。
如何判断是否有连续区间:
(1)若第一位相同,则将“上一区间”的第二位改成“当前区间”的第二位
(2)若第一位不相同:
a.“当前区间”的第一位大于“上一区间”的第二位,非连续区间;
b.“当前区间”的第一位小于“上一区间”的第二位,取“当前区间”和“当前区间”的第二位的较大值。
代码实现
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function(intervals) {
//先对区间做排序,从小到大
intervals.sort((a, b) => {
if(a[0] < b[0]) return -1;
if(a[0] > b[0]) return 1;
if(a[1] < b[1]) return -1;
if(a[1] > b[1]) return 1;
return 0;
})
//开始合并区间
const arr = new Array();
let start = intervals[0];
for(item of intervals) {
if(item[0] == start[0]) {
start[1] = item[1];
}
else {
if(item[0] <= start[1]) {
start[1] = Math.max(item[1], start[1]); //这里容易忽略
}
else {
arr.push(start);
start = item;
}
}
}
arr.push(start);
return arr;
};
小结
以前做过的算法题,实现起来还是会有忽略的地方,以记促思,加深印象。