給出若干閉合區間,合並所有重疊的部分。
給出的區間列表 => 合並后的區間列表:
[ [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]
挑戰
View Code
O(n log n) 的時間和 O(1) 的額外空間。
解題思路:這道題在最開始看的時候誤以為是已經排好序的,結果直接就分情況討論了,當然程序是妥妥沒有過。所以這樣的題目印象中還是比較常見的,首先按照左端點進行排序,排好序以后判斷右端點與下一個區間的左端點的關系來決定是否合並。
當然,我在這個過程中發現了java更加神奇的地方:1、java的Collections.sort函數及其相關函數調用;2、java中for的新用法。關於這兩點其他隨筆中也有總結
/** * Definition of Interval: * public class Interval { * int start, end; * Interval(int start, int end) { * this.start = start; * this.end = end; * } */ class Solution { /** * @param intervals: Sorted interval list. * @return: A new sorted interval list. */ public List<Interval> merge(List<Interval> intervals) { // write your code here List<Interval> result = new LinkedList<>(); if(intervals == null || intervals.size()<1){ return result; } Collections.sort(intervals,new Comparator<Interval>(){ @Override public int compare(Interval o1,Interval o2){ return o1.start - o2.start; } }); Interval prev = null; for (Interval item : intervals) { if (prev == null || prev.end < item.start) { result.add(item); prev = item; } else if (prev.end < item.end) { prev.end = item.end; } } return result; } }
