• LeetCode: Merge Intervals 解题报告


    Merge Intervals
    Given a collection of intervals, merge all overlapping intervals.

    For example,
    Given [1,3],[2,6],[8,10],[15,18],
    return [1,6],[8,10],[15,18].

    SOLUTION 1:

    1. 先使用Comparator 的匿名类对intervels进行排序。

    2. 把Intervals遍历一次,依次一个一个merge到第1个interval。 把第1个interval设置为last(最后一个加到结果集里)

    有2种情况:

      (1) cur在last的后面。把last加到结果集,将cur加到结果集中。

        (2)cur与last有重合部分,把它们合并,合并之后的区间作为新的last.

    所有的都扫完后,把last加到结果集中即可。

    注意:因为现在Leetcode所有入参都搞成了List,所以遍历时最好使用Iterator,这样无论对于Linkedlist,还是arraylist,性能都是一样的,否则使用get(i)对于LinkedList会相当的缓慢,就不是O(1)的时间了。

    复杂度:排序是NlogN, 而merge本身是N。所以总体时间复杂度是NlogN

     1 /**
     2  * Definition for an interval.
     3  * public class Interval {
     4  *     int start;
     5  *     int end;
     6  *     Interval() { start = 0; end = 0; }
     7  *     Interval(int s, int e) { start = s; end = e; }
     8  * }
     9  */
    10 public class Solution {
    11     public List<Interval> merge(List<Interval> intervals) {
    12         List<Interval> ret = new ArrayList<Interval>();
    13         if (intervals == null || intervals.size() == 0) {
    14             return ret;
    15         }
    16         
    17         Collections.sort(intervals, new Comparator<Interval>() {
    18             public int compare(Interval o1, Interval o2) {
    19                 // sort the intervals by the start.
    20                 return o1.start - o2.start;
    21             }
    22         });
    23         
    24         // 作为最后一个插入的区间
    25         Interval last = intervals.get(0);
    26         
    27         // 这里要考虑性能。使用iterator的话,对linkedlist会更快.        
    28         Iterator<Interval> itor = intervals.iterator();
    29         while (itor.hasNext()) {
    30             Interval cur = itor.next();
    31             // cur 在last的右边
    32             if (cur.start > last.end) {
    33                 // 将cur作为新的last.
    34                 ret.add(last);
    35                 last = cur;
    36             // cur与last有重合的部分,合并之    
    37             } else {
    38                 int s = last.start;
    39                 int e = Math.max(last.end, cur.end);
    40                 last = new Interval(s, e);
    41             }
    42         }
    43         
    44         // 把最后一个区间加上
    45         ret.add(last);
    46         
    47         return ret;
    48     }
    49 }
    View Code

    GITHUB CODE

    REF: http://blog.csdn.net/fightforyourdream/article/details/16882295

  • 相关阅读:
    arcgis中根据坐标文件生成要素类
    论C#及.net缺点及发展
    测绘类投稿指南
    .NET 4.0 Beta2中的BigInteger和Complex类(转)
    沈阳招聘.NET(C#)高级软件工程师
    测树学weibull拟合matlab程序,难者不会,会者不难
    景观生态专用软件
    使用匿名函数在后台线程中设置窗体控件属性 ()转
    matlab如何统计矩阵各元素的出现次数
    科学计算与开发环境
  • 原文地址:https://www.cnblogs.com/yuzhangcmu/p/4052706.html
Copyright © 2020-2023  润新知