#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。