1. 程式人生 > >Leetcode演算法——56、合併區間(merge intervals)

Leetcode演算法——56、合併區間(merge intervals)

給定一個區間的陣列,將所有重疊的區間進行合併。

示例1:

輸入: [[1,3],[2,6],[8,10],[15,18]]
輸出: [[1,6],[8,10],[15,18]]
解釋: [1,3] 和 [2,6] 有重疊,因此合併為 [1,6].

示例2:

輸入: [[1,4],[4,5]]
輸出: [[1,5]]

思路

先按照每個區間的起點排序,然後從小到大掃描。

每次掃描,檢視與前一個是否有重疊,如果是則合併成1個。

這種方法只需要檢視與前一個是否重疊,不需要檢視更往前的,因為之前的都處理完畢。

比如一個數組按照區間的起點排序後為:[[1,3],[2,4],[3,5]]
那麼從第二個區間[2,4]開始,檢視是否與前面的[1,3]重合,重合了則合併為[1,4]。
繼續掃描第三個區間[3,5],檢視是否與前面的[1,4]重合,重合了則合併為[1,5]。
因此最後三個區間合併為一個,結果輸出 [[1,5]]。

python實現

def merge(intervals):
    """
    :type intervals: List[Interval]
    :rtype: List[Interval]
    """
    intervals_sorted = sorted(intervals, key=lambda x : x[0])
    result = []
    for interval in intervals_sorted:
        # result中最後一個區間的右值>=新區間的左值,說明兩個區間有重疊
        if result and result[
-1][1] >= interval[0]: # 將result中最後一個區間更新為合併之後的新區間 result[-1][1] = max(result[-1][1], interval[1]) else: result.append(interval) return result if '__main__' == __name__: intervals = [[1,4],[4,5]] print(merge(intervals))