56.Merge Intervals---贪心---《编程之美》2.19区间重合判断

题目链接:https://leetcode.com/problems/merge-intervals/description/

题目大意:给出一串list,里面装interval类,这个类里有start和end两个属性,表示起始点和结束点,如果前面interval的结束点>后面interval的起始点,则合并两个interval,起始点是较小者,结束点是较大者。例子如下:

法一(借鉴):先排序后求解。这里用到了java自定义类的排序 。只是排序时是按照start排序,而不是按照end排序,当start小的排在前面的时候,只需要比较end即可,否则按end排序的话,start小的如果在后面还是会出现问题,而又不能只比较start,所以很容易漏测试用例。思想:按start升序排列,如果end<start,则直接add;否则,更改当前end为max(当前end,新end)。代码如下(耗时26ms):

 1     //自定义排序,按照start升序
 2     class sortStart implements Comparator<Interval> {
 3         public int compare(Interval i1, Interval i2) {
 4             return i1.start - i2.start;
 5         }
 6     }
 7     public List<Interval> merge(List<Interval> intervals) {
 8         Collections.sort(intervals, new sortStart());
 9         LinkedList<Interval> res = new LinkedList<Interval>();
10         for(Interval interval : intervals) {
11             //如果未重叠,则直接add
12             if(res.isEmpty() || res.getLast().end < interval.start) {
13                 res.add(interval);
14             }
15             //如果重叠,则更新end,因为已经按start排好序,所以只更新end即可,不用更新start
16             else {
17                 res.getLast().end = Math.max(res.getLast().end, interval.end);
18             }
19         }
20         return res;
21     }
View Code

 

posted on 2018-03-06 09:52  二十年后20  阅读(158)  评论(0编辑  收藏  举报

导航