56.Merge Intervals---貪心---《編程之美》2.19區間重合判斷

題目連接:https://leetcode.com/problems/merge-intervals/description/java

題目大意:給出一串list,裏面裝interval類,這個類裏有start和end兩個屬性,表示起始點和結束點,若是前面interval的結束點>後面interval的起始點,則合併兩個interval,起始點是較小者,結束點是較大者。例子以下:ide

法一(借鑑):先排序後求解。這裏用到了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
相關文章
相關標籤/搜索