[路飞]_js算法:leetcode 56-合并区间

126 阅读1分钟

leetcode 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,右半区间赋值为1,将区间边界(左或右)排序,从小到大,若边界一样,则左边界排在右边界前面。指针相加,结果为零说明找到合并区间。

/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function(intervals) {
 let arr=[];
   for(let i=0;i<intervals.length;i++){
     arr.push([intervals[i][0],-1])
     arr.push([intervals[i][1],1])
   }
   arr=arr.sort((a,b)=>{
     if(a[0]!==b[0])return a[0]-b[0];
     return a[1]-b[1]
   })
  let pre=-1,sum=0;
  let res=[];
  console.log(arr)
  for(let i=0;i<arr.length;i++){
    if(pre==-1)pre=arr[i][0];
    sum+=arr[i][1];
    if(sum==0){
      res.push([pre,arr[i][0]]);
      pre=-1;
      sum=0;
    }

  }
  return res
};