每天一道leetcode(Day 19)


56. 合并区间

题目描述

给出一个区间的集合,请合并所有重叠的区间。

示例

  • 示例 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] 可被视为重叠区间。

解题思路

官方题解:合并区间官方题解

思路:

  1. 按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的。如下图所示,标记为蓝色、黄色和绿色的区间分别可以合并成一个大区间,它们在排完序的列表中是连续的:
    image.png

  2. 将列表中的区间按照左端点升序排序。然后将第一个区间加入 res 数组中,并按顺序依次考虑之后的每个区间:

    • 如果当前区间的左端点在数组 res 中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组 res 的末尾;

    • 否则,它们重合,需要用当前区间的右端点更新数组 res 中最后一个区间的右端点,将其置为二者的较大值。

代码

/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function (intervals) {
  if (!intervals || !intervals.length) return [];
  intervals.sort((a, b) => a[0] - b[0]);
  let res = [intervals[0]];
  for (let i = 0; i < intervals.length; i++) {
    //如果当前元素的左端点大于res最后一个元素的右端点,说明不在res区间范围内
    if (res[res.length - 1][1] < intervals[i][0]) {
      res.push(intervals[i]);
    } else {
      //在res区间范围内,则要比较当前元素的右端点和res最后一个元素的右端点,确定新区间的右端点
      res[res.length - 1][1] = Math.max(
        res[res.length - 1][1],
        intervals[i][1]
      );
    }
  }
  return res;
};

参考

56. 合并区间


文章作者: CassielLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 CassielLee !
评论
  目录