码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 56. Merge Intervals

时间:2019-11-01 09:33:15      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:max   范围   元素   fir   etc   扫描线   cti   参与   方式   

合并区间。题意是给一个二维数组,其中每个元素给的是一个类似[start, end]的范围。要求把这些区间尽可能地merge在一起。这题又是用到扫描线的思想。首先需要根据start对input排序,然后从第二个interval SECOND开始,跟其之前的interval FIRST作比较。比较的方式是

  • 如果SECOND[start] > FIRST[end] - 说明两个interval没有交集,直接把FIRST加入最后的结果集
  • 如果SECOND[start] <= FIRST[end] - 说明两个interval有交集,需要merge。merge后的interval的start自然是FIRST[start],但是merge后的end是比较FIRST[end]和SECOND[end]谁大
  • 最后遍历完intervals之后需要再把最后一个interval加到结果集,因为它没有参与任何start, end的比较

时间O(nlogn) - 因为有sort了input

空间O(n) - 存放了最后的输出

 1 /**
 2  * @param {number[][]} intervals
 3  * @return {number[][]}
 4  */
 5 var merge = function(intervals) {
 6     // 1. Sort
 7     intervals.sort((a, b) => a[0] - b[0]);
 8     // 2. Traverse
 9     if (!intervals.length) {
10         return [];
11     }
12     let begin = intervals[0][0],
13         end = intervals[0][1];
14     let res = [];
15 
16     for (let i = 1; i < intervals.length; i++) {
17         if (intervals[i][0] > end) {
18             res.push([begin, end]);
19             begin = intervals[i][0];
20             end = intervals[i][1];
21         } else {
22             end = Math.max(end, intervals[i][1]);
23         }
24     }
25     res.push([begin, end]);
26     return res;
27 };

 

[LeetCode] 56. Merge Intervals

标签:max   范围   元素   fir   etc   扫描线   cti   参与   方式   

原文地址:https://www.cnblogs.com/aaronliu1991/p/11774880.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!