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].

复用 Insert Interval代码即可。

 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 ArrayList<Interval> merge(ArrayList<Interval> intervals) {
12         // Note: The Solution object is instantiated only once and is reused by each test case.
13         ArrayList<Interval> results = new ArrayList<Interval>();
14         if(intervals == null || intervals.size() == 0) return intervals;
15         for(int i = 0; i < intervals.size(); i ++)
16         {
17             results = insert(results,intervals.get(i));
18         }
19         return results;
20     }
21 
22     public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
23         // Note: The Solution object is instantiated only once and is reused by each test case.
24         ArrayList<Interval> results = new ArrayList<Interval>();
25         boolean sig = false;
26         for(int i = 0; i < intervals.size(); i ++)
27         {
28             if(intervals.get(i).start > newInterval.end)
29             {
30                 if(!sig)
31                 {
32                     results.add(newInterval);
33                     sig = true;
34                 }
35                 results.add(intervals.get(i));
36             }
37             else
38             {
39                 newInterval.end = Math.max(newInterval.end, intervals.get(i).end);
40             }
41             if(intervals.get(i).end < newInterval.start)
42             {
43                 results.add(intervals.get(i));    
44             }
45             else
46             {
47                 newInterval.start = Math.min(newInterval.start, intervals.get(i).start);
48             }
49         }
50          if(!sig)
51         {
52             results.add(newInterval);
53         }
54         return results;
55     }
56 }

 第二遍:

 1 public class Solution {
 2     public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
 3         // Note: The Solution object is instantiated only once and is reused by each test case.
 4         ArrayList<Interval> result = new ArrayList<Interval>();
 5         if(intervals == null || intervals.size() == 0)return result;
 6         PriorityQueue<Interval> pq = new PriorityQueue<Interval>(intervals.size(), new Comparator<Interval>(){
 7             public int compare(Interval a, Interval b){
 8                 return a.start > b.start ? 1 : (a.start == b.start ? 0 : -1);
 9             }
10         });
11         for(Interval interval:intervals){
12               pq.add(interval);
13         }
14         result.add(pq.poll());//poll out the minimum element in the queue
15         int max_end = result.get(0).end;
16         while(pq.size() != 0){
17             Interval tmp = pq.poll();
18             if(tmp.start <= max_end){
19                 max_end = max_end > tmp.end ? max_end : tmp.end;
20                 result.get(result.size() - 1).end = max_end;
21             }else{
22                 result.add(tmp);
23                 max_end = tmp.end;
24             }
25         }
26         return result;
27     }
28 }

先把interval 按start time 排序,再添加。 保存当前的最大end time。

原文地址:https://www.cnblogs.com/reynold-lei/p/3351231.html