每日一题--合并区间

143 阅读1分钟

这是我参与11月更文挑战的第17天,活动详情查看:[2021最后一次更文挑战]

题目

以数组 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 和 end 为当前区间的开始和结尾。 遍历intervals,如果下一个的起点小于当前区间的结尾,那么就说明这两个区间有重叠,要进行合并,所以要更新结尾,end = Math.max(end, intervals[i + 1][1]) 如果下一个的起点,大于当前区间的结尾,说明这两个区间没有重叠。之前start,end是一个单独的区间,所以保存起来。保存之后,重新设置strat和end,继续向后进行合并。 举例:[[1,3],[2,6],[8,10],[15,18]] 1、最开始start = 1和 end = 3 2、到[2,6],发现2(新的开始) < 3(上一个的结尾),证明这两个节点直接有重叠要合并,合并之后的结尾end = Math.max(3, 6) = 6。 3、到[8, 10],发现8(新的开始) > 6(上一个的结尾),说明这两个区间没有交集,此时要保存[start, end]即[1,6],这是前两个区间合并的结果。 保存之后,更新start = 8, end = 10; 4、到[15, 18], 发现15 > 10, 说明这两个区间没有交集,要保存[start,end]即[8,10],这是上一个不重叠的区间。然后更新start = 15, end = 18。 5、遍历结束,保存当前的[start,end],这是最后一个区间 代码

var merge = function(intervals) {
    intervals.sort((a, b) => a[0] - b[0])
    let res = [intervals[0]]
    for (let i = 1; i < intervals.length; i++) {
        if (res[res.length - 1][1] >= intervals[i][0]) {
            res[res.length - 1][1] = Math.max(res[res.length - 1][1], intervals[i][1])
        } else {
            res.push(intervals[i])
        }
    }
    return res
};