leetcode56:合併區間
阿新 • • 發佈:2018-11-15
給出一個區間的集合,請合併所有重疊的區間。(解題思想來源於:https://blog.csdn.net/qq_34364995/article/details/80788049 )
示例 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,4] 和 [4,5] 可被視為重疊區間。
解題思路:
1.將intervals按每一個元素的start進行升序排列。
2.此時後一個值的start一定在前一個值的start後(或相等)。這個時候只要判斷後一個的start是否比前一個的end大。這裡我設定了兩個指標l和h來表示區間的起始值和終點,列表res作為結果。判斷:
如果 intervals[i].start <= intervals[i-1].end, 那麼l保持不變,h為max(intervals[i].end, intervals[i-1].end)。否則,往列表res新增[l,h],更新l和h的值。接下來繼續迴圈判斷。
3.迴圈結束再往res新增[l,h]。
程式碼如下:
# Definition for an interval. # class Interval: # def __init__(self, s=0, e=0): # self.start = s # self.end = e class Solution: def merge(self, intervals): """ :type intervals: List[Interval] :rtype: List[Interval] """ if len(intervals) <= 1:return intervals res = [] intervals = sorted(intervals,key = lambda start: start.start) l = intervals[0].start h = intervals[0].end for i in range(1,len(intervals)): if intervals[i].start <= h: h = max(h,intervals[i].end)else: res.append([l,h]) l = intervals[i].start h = intervals[i].end res.append([l,h]) return res