【題目】
給你乙個 無重疊的 ,按照區間起始端點排序的區間列表。
在列表中插入乙個新的區間,你需要確保列表中的區間仍然有序且不重疊(如果有必要的話,可以合併區間)。
【示例 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] 重疊。
【示例 3】
輸入:intervals = , newinterval = [5,7]
輸出:[[5,7]]
【示例 4】
輸入:intervals = [[1,5]], newinterval = [2,3]
輸出:[[1,5]]
【示例 5】
輸入:intervals = [[1,5]], newinterval = [2,7]
輸出:[[1,7]]
【提示】
0 <= intervals.length <= 104
intervals[i].length == 2
0 <= intervals[i][0] <= intervals[i][1] <= 105
intervals 根據 intervals[i][0] 按 公升序 排列
newinterval.length == 2
0 <= newinterval[0] <= newinterval[1] <= 105
【**】
【python】
class
solution
:def
insert
(self, intervals: list[list[
int]
], newinterval: list[
int])-
> list[list[
int]]:
intervals.sort(key=
lambda x:
(x[0
],x[1]
))first=
0 pos=
1while pos<
len(intervals)
:if intervals[first][1
]>=intervals[pos][0
]:if intervals[first][1
]]:intervals[first][1
]=intervals[pos][1
] intervals.pop(pos)
else
: first=pos
pos+=
1return intervals
【方法2】先不排序,遍歷列表找到第乙個與newinterval有交集的區間,更新該區間,並從該區間開始依次合併下面可以合併的區間,直到區間不能合併為止。
class
solution
:def
insert
(self, intervals: list[list[
int]
], newinterval: list[
int])-
> list[list[
int]]:
flag=
1for index,x in
enumerate
(intervals):if
not(newinterval[0]
>x[1]
or newinterval[1]
):flag=
0#求並集
x[0]
,x[1]=
min(newinterval[0]
,x[0])
,max
(newinterval[1]
,x[1])
index+=
1while index<
len(intervals)
:if intervals[index-1]
[1]>=intervals[index][0
]:intervals[index-1]
[1]=
max(intervals[index-1]
[1],intervals[index][1
])intervals.pop(index)
else
:return intervals
if flag:
intervals.sort(key=
lambda x:x[0]
)return intervals
【方法3】
遍歷區間列表,找到第乙個與newinterval區間有交集的區間並記錄其位置,使用temp變數儲存開始的位置資訊。
對接下來的位置進行遍歷,與newinterval有交集的區間,並不斷更新newinterval,直到到列表結尾或者遇到與newinterval沒有交集的區間,跳出迴圈。
class
solution
:def
insert
(self, intervals: list[list[
int]
], newinterval: list[
int])-
> list[list[
int]]:
# 初始狀況判斷
ifnot newinterval:
return intervals
ifnot intervals:
return
[newinterval]
# 已經是起點有序的了
i =0 intervalslen =
len(intervals)
while i < intervalslen and intervals[i][1
]< newinterval[0]
: i +=
1# 儲存刪除之前的位置,最後在這個位置上插入
tempi = i
while i < intervalslen and intervals[i][0
]<= newinterval[1]
: newinterval[0]
=min
(newinterval[0]
, intervals[i][0
])newinterval[1]
=max
(newinterval[1]
, intervals[i][1
])i +=
1else
:del intervals[tempi:i]
intervals.insert(tempi, newinterval)
return intervals
57 插入區間
發現這個題目變簡潔了。區間直接以二維陣列的形式給出,而不是自己定義的資料結構,所以不需要自己寫排序函式了。給出乙個無重疊的 按照區間起始端點排序的區間列表。在列表中插入乙個新的區間,你需要確保列表中的區間仍然有序且不重疊 如果有必要的話,可以合併區間 示例 1 輸入 intervals 1,3 6,...
57 插入區間
第一道hard 思路 將新插入的區間乙個個去比較,有交集的,取並集並放到雜湊表裡,拿新並集繼續和下乙個比較,最後做乙個排序。注意插入到雜湊表中的資料,取更大的並集即可。題目 給出乙個無重疊的 按照區間起始端點排序的區間列表。在列表中插入乙個新的區間,你需要確保列表中的區間仍然有序且不重疊 如果有必要...
57 插入區間
給出乙個無重疊的 按照區間起始端點排序的區間列表。在列表中插入乙個新的區間,你需要確保列表中的區間仍然有序且不重疊 如果有必要的話,可以合併區間 示例 1 輸入 intervals 1,3 6,9 newinterval 2,5 輸出 1,5 6,9 示例 2 輸入 intervals 1,2 3,...