第1题 力扣LeetCode 热题 HOT 100 (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 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
题解:
将重叠的区间合并为一个区间,首先先对输入数组进行排序,使得数组中的区间按start连续排布,排序规则为数组中区间start值从小到大排序,如果start值相同,则按end值从小到大排序。
输入值: intervals =[[2,8],[2,5],[3,4],[18,18], [19, 20], [20,22]]
排序后: intervals =[[2,5],[2,8],[3,4],[18,18], [19, 20], [20,22]]
对排序后的数组,一个重叠区间就可以很轻松看的出来了。第一个重叠区间start为2,end一开始设置为5,然后发现数组第二个区间[2,8] 与重叠区间[2,5]构成新的重叠区间[2,8],更新重叠区间,然后继续遍历数组,数组第三个区间[3,4]落在重叠区间[2,8]中,不做任何处理,第四个区间[18,18],发现跟重叠区间[2,8]完全不重叠,故设置为第二个重叠区间为[18,18]。继续,第五个区间 [19,20],发现与上一个重叠区间完全不重叠,故新建一个重叠区间[19,20], 继续,第6个区间为[20,22],与[19,20]重叠,更新重叠区间的end值,更新后的重叠区间为[19,22]。
输出:[ [ 2, 8 ], [ 18, 18 ], [ 19, 22 ] ]
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function (intervals) {
//排序
intervals.sort((a, b) => {
if (a[0] != b[0]) {
return a[0] - b[0];
} else {
return a[1] - b[1];
}
})
//result 为 不重叠的区间数组,初始化为空数组。
let result = [];
//设置变量left 和, right 维护一个重叠区间的左右范围。
//第一个重叠区间的 left 一定为 数组[0]start值。 right先设置为数组[0]end值,后面会对right值进行维护。
let left = intervals[0][0], right = intervals[0][1];
for (let i = 0; i < intervals.length; i++) {
//重叠区间的right 值小于当前遍历中区间的start值,说明需新建一个重叠区间。
if (right < intervals[i][0]) {
result.push([left, right]);
left = intervals[i][0];
right = intervals[i][1];
} else if (right < intervals[i][1]) {
//重叠区间的right 值大于或等于当前区间的start值,并且小于当前遍历区间的end值,说明需更新重叠区间。
right = intervals[i][1];
}
// 当遍历到最后一个区间时,把最后一个重叠区间添加进结果。
if (i == intervals.length - 1) {
result.push([left, right]);
}
}
return result;
};