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