原题链接在这里: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 Interval, Add Bold Tag in String, Partition Labels, Meeting Rooms, Meeting Rooms II.