1. 程式人生 > >#56 Merge intervals

#56 Merge intervals

public List<Interval> merge(List<Interval> intervals) {}

以上是題目和例子。

做法:(忘了是自己寫出來的還是參考答案的orz)

 1. 先把interval的start和end points分別取出來,放到array裡,再用Array.sort(...),把所有起點之間排序,然後把所有終止點之間排序。

2. 然後用一個for迴圈,迴圈過每一個interval,但是實際上檢視的是,按大小排序的start point以及end point。設定兩個指標,一個指向現在正在尋找的start point,一個指向現在正在尋找的end point。如果當前的end point大於等於下一個start point,就直接到下個interval接著找,如果當前的end point小於下一個start,就把現在的end point當做end,然後把之前預設的start當做start,組成一個interval塞進result list裡。

3. Time complexity: O(nlogn) because of the sorting algorithm

Space complexity: O(n) because I am building a result list

我的程式碼:

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 
*/ class Solution { public List<Interval> merge(List<Interval> intervals) { int n = intervals.size(); int[] starts = new int[n]; int[] ends = new int[n]; for (int i = 0; i < n; i++) { starts[i] = intervals.get(i).start; ends[i]
= intervals.get(i).end; } Arrays.sort(starts); Arrays.sort(ends); // loop through List<Interval> res = new ArrayList<Interval>(); for (int i = 0, j = 0; i < n; i++) { // j is start of interval. if (i == n - 1 || starts[i + 1] > ends[i]) { res.add(new Interval(starts[j], ends[i])); j = i + 1; } } return res; } }

有幾個要注意的點:

1. 當iteration的指標移到最後一個的時候,無論如何都要把當前的interval塞進去。因為如果這個interval可以和之前的interval合併的話,end point已經更新到現在這個interval了,所以可以直接把當前interval加入到result裡。如果這個interval不能和之前的interval合併,當前的interval也要當做一個單獨的interval加入到result裡面,因為最後一個不加不行。所以,在loop裡面的if判斷裡,可以用一個 || 來同時包括兩種情況。

2. variable定義要clean。