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 }