[LeetCode 56. 合并区间] | 刷题打卡

184 阅读2分钟

题目

以数组 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] 可被视为重叠区间。

思路

这题解题思路是使用排序,我们按照区间的左端点进行排序,那么在排完序的列表中,可以合并的区间一定是连续的。

我们使用数组res存储最终的答案。

首先,我们将列表中的区间按照左端点升序排列,然后我们将第一个区间加入 merged 数组,并按照顺序依次考虑之后的每个区间。

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

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

AC代码

var merge = function (intervals) {
  // 如果传递进来的数组长度为0 返回一个空数组
  if (intervals.length === 0) {
    return []
  }
  // 创建合并数组
  var res = []
  // 将数组进行升序排序
  intervals.sort(function (a, b) {
    return a[0] - b[0]
  })
  // 结果数组放进第一个数组
  res.push(intervals[0])
  // 从原数组的第一个元素进行遍历
  for (var i = 1; i < intervals.length; i++) {
    // 如果当前区间的左端点 大于 merge数组最后一个元素的右端点
    if (intervals[i][0] > res[res.length - 1][1]) {
      // 说明这个数组可以直接放进merge数组中
      res.push(intervals[i])
    } else { // 说明有区间有交集 当前区间的左端点小于等于最后一个元素的右端点
      // 如果当前区间的右端点 大于 merge 最后一个右端点
      if (intervals[i][1] > res[res.length - 1][1]) {
        // 更新右端点为最大值
        res[res.length - 1][1] = intervals[i][1]
      }
    }
  }
  return res
};

总结

本题实际是对完全包含、部分包含、完全不包含区间合并的理解。先将数据按照大小排序,剩下的问题就是区间合并,问题很容易就解决啦~ 小伙伴们,继续加油噢!

image.png

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情:juejin.cn/post/693314…