56. 合并区间

题目描述:

  以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

 

解题思路:

1.以每个区间的首下标为标准对各个区间进行排序,这样可以保证下一次遍历出现的区间只会出现在当前区间的右边,而不用考虑左边的情况;

2.排序后,以上一个区间[start,end]作为参照,考虑当前区间的首尾下标[s,e]:

  • 若s在[start,end]区间内,必然可以合并。此时,再比较两个区间的尾下标,谁越远,谁作为新区间的尾坐标;
  • 若s在[start,end]区间右边,则表示当前区间与上一个区间无法合并,将上一个区间纳入ans数组,并将更新参照区间为当前区间;
  • 无需考虑s在区间左边的情况,因为前面排序就已经确保遍历到的下一个区间的首下标只能等于或大于当前区间首下标;

3.遍历完所有区间后,还要将最后一个参照区间纳入ans数组,算法结束;

 

 

复制代码
var merge = function(intervals) {
    intervals.sort(function(a,b){return a[0]-b[0]});//以首下标对区间排序
    //初始化参考区间
    let start = intervals[0][0];
    let end = intervals[0][1];
let ans
= []; for(let i=1;i<intervals.length;i++){ let s = intervals[i][0]; if(s<=end){ end = Math.max(intervals[i][1],end); continue; } if(s>end){ ans.push([start,end]); start = s; end = intervals[i][1]; } } ans.push([start,end]); return ans; };
复制代码

 

posted @   ˙鲨鱼辣椒ゝ  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示