排序 中等 57 插入區間

2021-10-20 20:43:29 字數 3554 閱讀 9663

【題目】

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

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

【示例 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,...