leetcode 56 合併區間 57

2021-10-03 08:21:35 字數 3627 閱讀 3707

插入區間

中等

給出乙個區間的集合,請合併所有重疊的區間。

例項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,3]和[2,6]重疊了[2,3],所以合併

判斷條件是 2小於3 所以有重疊

可以設定第乙個區間的範圍為start和end

一旦end大於下乙個區間的左端,就是有重疊,那麼這兩個區間合併的結果的左端就是start,右端是end和第二個區間的右端較大的值,也符合圖上第二種情況

所以要滿足上述情況,需要提前將各區間按照左端排序,就不用考慮start大小的問題

class

solution

:def

merge

(self, intervals: list[list[

int]])

-> list[list[

int]]:

iflen

(intervals)==0

:return

intervals.sort(key=

lambda x: x[0]

) start = intervals[0]

[0] end = intervals[0]

[1] result =

for interval in intervals[1:

]:# 當前區間存在重疊,當前區間起始位置小於上一區間的結束位置

if interval[0]

<= end:

end =

max(end, interval[1]

)# 當前不存在重疊

else

:[start, end]

)# 加入解集

start = interval[0]

# 更新start end

end = interval[1]

[start, end]

)return result

困難給出乙個無重疊的 ,按照區間起始端點排序的區間列表。

在列表中插入乙個新的區間,你需要確保列表中的區間仍然有序且不重疊(如果有必要的話,可以合併區間)。

示例1:

輸入: intervals = [[1,3],[6,9]], newinterval = [2,5]

輸出: [[1,5],[6,9]]

示例2:

輸入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newinterval = [4,8]

輸出: [[1,2],[3,10],[12,16]]

解釋: 這是因為新的區間 [4,8] 與 [3,5],[6,7],[8,10] 重疊

其實就利用上一題就可以,將要插入的區間加入到區間集合裡,然後用上一題的**合併。

class

solution

:def

insert

(self, intervals: list[list[

int]

], newinterval: list[

int])-

> list[list[

int]]:

defmerge

(intervals):if

len(intervals)==0

:return

intervals.sort(key=

lambda x: x[0]

) start = intervals[0]

[0] end = intervals[0]

[1] result =

for interval in intervals[1:

]:if interval[0]

<= end:

end =

max(end, interval[1]

)else

:[start, end]

) start = interval[0]

end = interval[1]

[start, end]

)return result

return merge(intervals)

當然,如果不用上一題的**

首先需要找到需要插入區間左端右端在各區間的位置

然後根據該區間的左端右端的位置分情況討論

class

solution

:def

insert

(self, intervals: list[list[

int]

], newinterval: list[

int])-

> list[list[

int]]:

i =0 n =

len(intervals)

if n==0:

return

[newinterval]

while i

> intervals[i][1

]:i +=

1 left = i

while i

>= intervals[i][0

]:i +=

1 right = i

if left >= n:

result = intervals +

[newinterval]

elif left == right:

intervals.insert(left, newinterval)

result = intervals

else

: result = intervals[

:left]

+ \ [

[min

(intervals[left][0

], newinterval[0]

),max(intervals[right-1]

[1], newinterval[1]

)]]+ \

intervals[right:

]return result

Leetcode 56 合併區間

對所有區間按起點位置進行排序 遍歷到k點後的 l,r 已知的包含k點的最大區間 遍歷到k 1點,若該起點屬於 l,r 那麼可能擴充套件這個區間的終點,r max r,k 1點的end definition for an interval.struct interval interval int s,...

LeetCode 56 合併區間

給出乙個區間的集合,請合併所有重疊的區間。示例 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...

LeetCode 56 合併區間

給出乙個區間的集合,請合併所有重疊的區間。示例 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 可被視為重疊區間。題意還是好理...