• 合并区间(LintCode) .


    合并区间

    给出若干闭合区间,合并所有重叠的部分。

    样例

    给出的区间列表 => 合并后的区间列表:

    [                     [
      [1, 3],               [1, 6],
      [2, 6],      =>       [8, 10],
      [8, 10],              [15, 18]
      [15, 18]            ]
    ]
    
    挑战

    O(n log n) 的时间和 O(1) 的额外空间。

    思路是清晰的,代码是混乱的。先用Collection.sort()方法对List排序。当然也可以先toArray()然后用Arrays.sort()排序。但是都需要写一个实现Comparator接口的内部类。

     1 /**
     2  * Definition of Interval:
     3  * public class Interval {
     4  *     int start, end;
     5  *     Interval(int start, int end) {
     6  *         this.start = start;
     7  *         this.end = end;
     8  *     }
     9  */
    10 
    11 class Solution {
    12     /**
    13      * @param intervals: Sorted interval list.
    14      * @return: A new sorted interval list.
    15      */
    16      
    17     public class IntervalCmp implements Comparator<Interval> {
    18         public int compare(Interval i1, Interval i2) {
    19             if (i1.start < i2.start) return -1;
    20             if (i1.start == i2.start && i1.end <= i2.end) return -1;
    21             return 1;
    22         }
    23      }
    24     public List<Interval> merge(List<Interval> intervals) {
    25         if(intervals.size() == 1)return intervals;
    26         List<Interval> list = new ArrayList<Interval>();
    27         int max1 = -1;
    28         int min1 = 99999999;
    29         int max = -1;
    30         int min = 99999999;
    31         
    32         //借助Collections。sort()排序,百度了一下JDK7不加上这句的话可能会报错
    33         System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
    34         Collections.sort(intervals, new IntervalCmp());
    35         
    36         for(int i = 0;i<intervals.size();i++) {
    37             Interval x = intervals.get(i);
    38             if(x.start > max1 || x.end < min1) {
    39                 min = x.start;
    40                 max = x.end;
    41                 for(int j = i+1;j<intervals.size();j++) {
    42                     Interval y = intervals.get(j);
    43                     if(y.end >= min && y.start <= max) {
    44                         if(max < y.end) {
    45                             max = y.end;
    46                         }
    47                         if(min > y.start) {
    48                             min = y.start;
    49                         }
    50                     }
    51                 }
    52                 x.end = max;
    53                 x.start = min;
    54                 if(max1 < max) max1 = max;
    55                 if(min1 > min) min1 = min;
    56                 list.add(x);
    57             }
    58         }
    59         return list;
    60     }
    61 
    62 }
    View Code

    在说一下比较器抛

    java.lang.IllegalArgumentException: Comparison method violates its general contract 

    这个异常,JDK7以后用比较器在两个元素相等的情况下需要返回0。可参考:这里

  • 相关阅读:
    摘:复习STL
    C#:在其它dll中调用此文件中的资源
    摘录:CSharp调用C动态链接库详解
    C/C++基本数据类型
    mysqlreport指南
    mysqlreport工具
    收藏一个简洁的PHP可逆加密函数
    解决MySQL查询数据不一致诟病
    Ubuntu下搭建C/C++开发环境
    mysql:主键和索引的区别
  • 原文地址:https://www.cnblogs.com/FJH1994/p/5022466.html
Copyright © 2020-2023  润新知