1288. 删除被覆盖区间
56. 合并区间
986. 区间列表的交集
# 1288. 删除被覆盖区间
class Solution:
def removeCoveredIntervals(self, intervals: List[List[int]]) -> int:
# 按照起点升序排列,起点相同时,按照终点降序排列
intervals.sort(key = lambda x: (x[0], -x[1]))
# 记录被覆盖区间的个数
res = 0
# 记录合并区间的起点和终点
left, right = intervals[0][0], intervals[0][1]
i = 1
while i < len(intervals):
curr = intervals[i]
# 覆盖
if left <= curr[0] and curr[1] <= right:
res += 1
# 合并
if curr[0] <= right <= curr[1]:
right = curr[1]
# 无交集,更新left right
if right <= curr[0]:
left, right = curr[0], curr[1]
i += 1
return len(intervals) - res
# 56. 合并区间
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort()
res = [intervals[0]]
i = 1
while i < len(intervals):
last = res[-1]
curr = intervals[i]
if curr[0] <= last[1]:
last[1] = max(last[1], curr[1])
else:
res.append(curr)
i += 1
return res
# 986. 区间列表的交集
class Solution:
def intervalIntersection(self, firstList: List[List[int]], secondList: List[List[int]]) -> List[List[int]]:
i, j = 0, 0
res = []
while i < len(firstList) and j < len(secondList):
a1, a2 = firstList[i][0], firstList[i][1]
b1, b2 = secondList[j][0], secondList[j][1]
if b2>=a1 and b1<=a2:
c1, c2 = max(a1, b1), min(a2, b2)
res.append([c1, c2])
if a2 < b2:
i += 1
else:
j += 1
return res