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

    原题链接在这里:https://leetcode.com/problems/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].

    题解:

    首先sort list 中的interval. 然后比较 前一个 interval的end是否 >= 后一个interval 的start, 若是,则合并这两个interval, 用来和下一个比较。若不是,则把这段interval 加到res中去。

    通过本题见到了如何改写Comparator, 参见了这篇文章:http://www.blogjava.net/yesjoy/articles/126046.html 从Comparator Interface implement 出一个class, 定义了interval的比较方法。

    Note: 注意corner case, 若是pre的end 和 下一个的start 相等,也是要合并的。

    Time Complexity: O(n*logn). n是List<Interval> intervals 的长度,排序用了O(nlogn). 之后只走了一遍list, 用了O(n), 一共是 O(n*logn).

    Space: O(n). 是res的大小.

    AC Java:

     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> res = new ArrayList<Interval>();
    13         if(intervals == null || intervals.size() == 0){
    14             return res;
    15         }
    16         
    17         //排序
    18         Collections.sort(intervals, new Comparator<Interval>(){
    19            public int compare(Interval i1, Interval i2){
    20                if(i1.start == i2.start){
    21                    return i1.end-i2.end;
    22                }
    23                return i1.start - i2.start;
    24            } 
    25         });
    26         
    27         Interval pre = intervals.get(0);
    28         for(int i = 1; i<intervals.size(); i++){
    29             Interval cur = intervals.get(i);
    30             if(pre.end >= cur.start){
    31                 pre.end = Math.max(pre.end, cur.end);
    32             }else{
    33                 res.add(pre);
    34                 pre = cur;
    35             }
    36         }
    37         
    38         //最后要加上最后一段interval
    39         res.add(pre);
    40         return res;
    41     }
    42 }

     类似Insert IntervalAdd Bold Tag in StringPartition LabelsMeeting RoomsMeeting Rooms IIRange Module.

  • 相关阅读:
    POJ 2892 Tunnel Warfare(树状数组+二分)
    POJ 2886 Who Gets the Most Candies?(树状数组+二分)
    POJ 2492 A Bug's Life(并查集)
    POJ 1182 食物链(并查集)
    POJ 1703 Find them, Catch them(种类并查集)
    TC SRM 582 DIV 2
    函数
    shell进阶--流程
    计划任务 at,cron
    kill命令
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4886559.html
Copyright © 2011-2022 走看看