zoukankan      html  css  js  c++  java
  • [LeetCode] 56. Merge Intervals

    Given a collection of intervals, merge all overlapping intervals.

    Example 1:

    Input: [[1,3],[2,6],[8,10],[15,18]]
    Output: [[1,6],[8,10],[15,18]]
    Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
    

    Example 2:

    Input: [[1,4],[4,5]]
    Output: [[1,5]]
    Explanation: Intervals [1,4] and [4,5] are considered overlapping.

    NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

    合并区间。

    题意是给一个二维数组,其中每个元素给的是一个类似[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]谁大

    时间O(nlogn) - 因为有sort

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

    JavaScript实现

     1 /**
     2  * @param {number[][]} intervals
     3  * @return {number[][]}
     4  */
     5 var merge = function (intervals) {
     6     // corner case
     7     if (intervals === null || intervals.length === 0) {
     8         return intervals;
     9     }
    10 
    11     // normal case
    12     let res = [];
    13     intervals.sort((a, b) => a[0] - b[0]);
    14     let cur = intervals[0];
    15     res.push(cur);
    16     for (let interval of intervals) {
    17         if (interval[0] <= cur[1]) {
    18             cur[1] = Math.max(cur[1], interval[1]);
    19         } else {
    20             cur = interval;
    21             res.push(cur);
    22         }
    23     }
    24     return res;
    25 };

    Java实现

     1 class Solution {
     2     public int[][] merge(int[][] intervals) {
     3         // corner case
     4         if (intervals.length <= 1) {
     5             return intervals;
     6         }
     7 
     8         // normal case
     9         Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
    10         List<int[]> res = new ArrayList<>();
    11         int[] cur = intervals[0];
    12         res.add(cur);
    13         for (int[] interval : intervals) {
    14             if (interval[0] <= cur[1]) {
    15                 cur[1] = Math.max(cur[1], interval[1]);
    16             } else {
    17                 cur = interval;
    18                 res.add(cur);
    19             }
    20         }
    21         return res.toArray(new int[res.size()][]);
    22     }
    23 }

    扫描线相关题目

    LeetCode 题目总结

  • 相关阅读:
    Linux的chattr与lsattr命令详解
    ls命令
    linux PS1
    which,whereis,locate,find
    linux下的文件结构
    Linux各种命令
    PHP将两个二维数组合并为一个二维数组的方法
    vagrant virtualbox VM inaccessible解决办法
    常用Mysql查询语句
    删除数组元素并重建索引的方法
  • 原文地址:https://www.cnblogs.com/cnoodle/p/11774880.html
Copyright © 2011-2022 走看看