LeetCode第[56]題(Java):Merge Intervals

來源:互聯網
上載者:User

標籤:esc   als   直接   自己的   tar   amp   style   java   複雜度   

題目:合并區間

難度:Medium

題目內容:

 

Given a collection of intervals, merge all overlapping intervals.

翻譯:

給定一個區間的集合,合并所有重疊的區間。

Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]Output: [[1,6],[8,10],[15,18]]

Example 2:

Input: [[1,4],[4,5]]Output: [[1,5]]

 

我的思路:因為可能是亂序的,不好逐個比較,所以需要排序

1、將List內的元素進行排序(利用比較子),然後從前往後比較 ;

2、當前的end和後一個的start,看是否需要合并

3、如果需要合并則當前的end等於它自己與後一個的end中取大的,然後將後一個remove()掉 

 

My Code:

 1 class Solution { 2     public List<Interval> merge(List<Interval> intervals) { 3         Collections.sort(intervals, new MyComparator()); 4          5         for (int i = 0; i < intervals.size() - 1; i++) { 6             if (intervals.get(i).end >= intervals.get(i+1).start) { 7                 intervals.get(i).end = intervals.get(i).end > intervals.get(i+1).end ? intervals.get(i).end : intervals.get(i+1).end; 8                 intervals.remove(i+1); 9                 i--;10             }    11         }12         return intervals;13     }14 }15 16 class MyComparator implements Comparator<Interval> {  17   18     public int compare(Interval one, Interval two) {19         return one.start - two.start;20     }  21       22 }  

我的複雜度:O(NlogN)    主要是排序的那裡用了nlogn    剩下的只有n

編程過程中的問題:

1、忘記比較子怎麼實現:

      方法一:將List中的類實現Comparable<E>介面(本題的E就是Interval),並重寫compareTo方法(一個傳入對象)  用自己的值和傳入對象的值做比較即可。

【比較規則:自己比傳入對象大就返回零,等於就等於0,小於就小於0,所以一般直接   return   自己 - 傳入對象】如下:

    public int compareTo(Interval o) {        return start - o.start;    }

        但是,本題的Interval是寫死的不能在編輯中修改,但是不要急,還有另外一種辦法:

  方法二:自己寫一個類實現Comparator<E>介面,並重寫compare方法(兩個傳入對象)

【比較規則:與上面類似  一般直接 return   前面一個對象 - 後面一個對象】如下:

    public int compare(Interval one, Interval two) {        return one.start - two.start;    }  

   擴充:那如果要比較兩個屬性呢,比如先比較名字,再比較年齡————代碼如下

    public int compare(Person one, Person two) {          int i = one.name.compareTo(two.name); //比較名字字串          if (i == 0) { //如果名字一樣,則繼續比較年齡              return one.age - two.age;          } else { //首先比較名字,名字不一樣,則返回比較結果              return i;          }      } 

  使用此方法需要在sort()方法中傳入作為第二個參數,(所以一般可直接在sort方法裡使用匿名類)如下:

        Collections.sort(intervals, new Comparator<Interval>(){            @Override            public int compare(Interval interval1, Interval interval2){                return interval1.start - interval2.start;            }        });

2、發現需要合并後,是不能直接將end取後一個的end的,因為後一個的end也是有可能比當前的小的,比如【【1,6】,【3,5】】,所以需要判斷一下end的大小;

3、因為是順序向後迴圈的,List調用remove方法去掉後一個之後,i 會指向後一個繼續進行迴圈,但是此時應該仍然指向自己,繼續判斷後一個是否需要合并,所以需要 i - -。

  擴充:如果是從後往前迴圈的呢?需要 i ++?

    此時刪去了下標i - 1,然後 i -- ,i 移到 下標 i -1 , 而此時的下標 i -1 就是remove之前的 下標 i 所以不再需要做操作。

    例如:下標 0,1,2  此時 i 等於2 ,將1remove(此時的下標2自動變為1),然後 i -- ,i還是指向原來的2的位置。

  所以,當在迴圈中調用List的remove方法的時候,一定要考慮下標的變化,而調整指標 i 的值。

 

 

答案代碼:

 1 class Solution { 2     private class IntervalComparator implements Comparator<Interval> { 3         @Override 4         public int compare(Interval a, Interval b) { 5             return a.start < b.start ? -1 : a.start == b.start ? 0 : 1; 6         } 7     } 8  9     public List<Interval> merge(List<Interval> intervals) {10         Collections.sort(intervals, new IntervalComparator());11 12         LinkedList<Interval> merged = new LinkedList<Interval>();13         for (Interval interval : intervals) {14             if (merged.isEmpty() || merged.getLast().end < interval.start) {15                 merged.add(interval);16             }17             else {18                 merged.getLast().end = Math.max(merged.getLast().end, interval.end);19             }20         }21 22         return merged;23     }24 }

答案思路:和我的思路是一樣的,先排序然後從頭到位判斷是否需要合并,

不過他使用了隊列,空間複雜度提高了,但是這樣避免了remove方法帶來的多餘的時間複雜度,二者各有好處。

LeetCode第[56]題(Java):Merge Intervals

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.