LeetCode56-合并区间 | 算法练习系列

482 阅读2分钟

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

前言

每日用js写一道算法题,今天来一道处理数组格式的算法题,合并区间,把相同的区间合并成一个大区间,最后输出最终结果

题目描述

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

题目分析和解题思路

  • 从题意可知,这是一个二维数组,我们要合并一维数组中的每一个有相同区间的项,这里可能存在多种情况,前一项和后一项没有任何相同区间的情况,前一项完全包含后一项的情况,前一项的第一个值大于第二项的第一个值的情况,等等,是不是感觉很复杂
  • 其实这题的关键就是我们首先要把这个二维数组进行排序,这样我们得到的一维数组就只有三种情况了,要么是后一项的区间在前一项中,要不是两个毫无相同区间的两个区间,要不是有一部分相同区间的两个区间(注意:这里要取两个区间的结束值的最大值作为合并区间的结束值)
  • 还要注意的一点是,当循环结束的时候要记得判断curr是否为空,也就是最后一次比较的时候后一项和前一项毫无相同区间的情况,这时要再push进一个curr
  • 大致就是如此,下面上代码
var merge = function(intervals) {
   if(intervals.length<2){
       return intervals
   }
   intervals.sort((a,b)=>{
       return a[0]-b[0]
   })
   let curr = intervals[0]
   let result = []
   for(let interval of intervals){
       if(curr[1]>=interval[0]){
           curr[1] = Math.max(curr[1],interval[1])
       }else{
           result.push(curr)
           curr=interval
       }
   }
   if(curr.length !== 0){
       result.push(curr)
   }
   return result
};

总结

本题目的重点就是要想到给二维数组排序,要不然处理起来会非常麻烦,其次就是当两个区间有相同区间的时候,合并的时候要把两个项的最大值最为合并项的结束值