第1题 力扣LeetCode 热题 HOT 100 (56. 合并区间)

第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;
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值