时间复杂度
O
(
N
l
o
g
N
)
O(NlogN)
O(NlogN), 排序需要
O
(
N
l
o
g
N
)
O(NlogN)
O(NlogN)的时间
空间复杂度
O
(
l
o
g
N
)
O(logN)
O(logN), 排序需要
O
(
l
o
g
N
)
O(logN)
O(logN)的空间(递归)
classSolution:definsert(self, intervals: List[List[int]], newInterval: List[int])-> List[List[int]]:
res =[]
intervals.append(newInterval)
intervals.sort(key=lambda x: x[0])for i inrange(len(intervals)):ifnot res:
res.append(intervals[i])elif res[-1][1]< intervals[i][0]:
res.append(intervals[i])elif res[-1][1]>= intervals[i][0]and res[-1][1]<= intervals[i][1]:
res[-1][1]= intervals[i][1]elif res[-1][1]>= intervals[i][0]and res[-1][1]> intervals[i][1]:continuereturn res
classSolution:definsert(self, intervals: List[List[int]], newInterval: List[int])-> List[List[int]]:
res =[]
intervals.append(newInterval)
intervals.sort(key=lambda x: x[0])for i inrange(len(intervals)):ifnot res:
res.append(intervals[i])elif res[-1][1]< intervals[i][0]:
res.append(intervals[i])else:
res[-1][1]=max(res[-1][1], intervals[i][1])return res
解2
思路
对于区间
S
1
=
[
l
1
,
r
1
]
S_1 = [l_1, r_1]
S1=[l1,r1] 和
S
2
=
[
l
2
,
r
2
]
S_2 = [l_2, r_2]
S2=[l2,r2], 如果它们之间没有重叠(没有交集)
说明要么
S
1
S_1
S1 在
S
2
S_2
S2 的左侧, 此时有
r
1
<
l
2
r_1 < l_2
r1<l2
要么
S
1
S_1
S1 在
S
2
S_2
S2 的右侧,此时有
l
1
>
r
2
l_1 > r_2
l1>r2
如果
r
1
<
l
2
r_1 < l_2
r1<l2 和
l
1
>
r
2
l_1 > r_2
l1>r2 二者均不满足, 说明
S
1
S_1
S1 和
S
2
S_2
S2 必定有交集, 它们的交集即为
[
max
(
l
1
,
l
2
)
,
min
(
r
1
,
r
2
)
]
[\max(l_1, l_2), \min(r_1, r_2)]
[max(l1,l2),min(r1,r2)] 并集即为
[
min
(
l
1
,
l
2
)
,
max
(
r
1
,
r
2
)
]
[\min(l_1, l_2), \max(r_1, r_2)]
[min(l1,l2),max(r1,r2)]
当我们遍历到区间
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri] 时:
如果
r
i
<
left
r_i < \textit{left}
ri<left, 说明
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri] 与 S 不重叠并且在其左侧, 我们可以直接将
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri] 加入res
如果
l
i
>
right
l_i > \textit{right}
li>right, 说明
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri] 与 S 不重叠并且在其右侧, 我们可以直接将
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri] 加入res
如果上面两种情况均不满足,说明
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri] 与 S 重叠, 我们无需将
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri] 加入res. 此时, 我们需要将 S 与
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri] 合并, 即将 S 更新为其与
[
l
i
,
r
i
]
[l_i, r_i]
[li,ri] 的并集
复杂度
时间复杂度
O
(
N
)
O(N)
O(N)
空间复杂度
O
(
1
)
O(1)
O(1)
classSolution:definsert(self, intervals: List[List[int]], newInterval: List[int])-> List[List[int]]:
newLeft, newRight = newInterval
res =[]
placed =Falsefor left, right in intervals:if newRight < left:ifnot placed:
res.append([newLeft, newRight])
placed =True
res.append([left, right])elif right < newLeft:
res.append([left, right])else:
newLeft =min(left, newLeft)
newRight =max(right, newRight)ifnot placed:
res.append([newLeft, newRight])return res