1. 程式人生 > >leetcode56:合併區間

leetcode56:合併區間

給出一個區間的集合,請合併所有重疊的區間。(解題思想來源於: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