Leetcode演算法——56、合併區間(merge intervals)
阿新 • • 發佈:2018-12-20
給定一個區間的陣列,將所有重疊的區間進行合併。
示例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))