1272. 删除区间
大约 2 分钟
---
1272. 删除区间
- 标签:数组
- 难度:中等
题目链接
题目大意
描述:给定一个不重叠的区间列表 (按区间起始端点从小到大排序)和一个要删除的区间 。
要求:删除 中所有与 重叠的部分,返回剩余的区间(按起始端点升序排列)。
说明:
- 。
- 。
- 。
示例:
- 示例 1:
输入:intervals = [[0,2],[3,4],[5,7]], toBeRemoved = [1,6]
输出:[[0,1],[6,7]]
解释:删除 [1,6] 后,[0,2] 剩下 [0,1],[3,4] 被完全删除,[5,7] 剩下 [6,7]。- 示例 2:
输入:intervals = [[0,5]], toBeRemoved = [2,3]
输出:[[0,2],[3,5]]解题思路
思路 1:分类讨论
1. 核心思想
遍历每个区间 ,删除区间为 。根据当前区间和删除区间的位置关系,可以分为几种情况:
- 完全不重叠: 或 ,保留整个区间。
- 完全被覆盖: 且 ,整个区间被删除。
- 左边部分重叠: 且 且 ,保留 。
- 右边部分重叠: 且 且 ,保留 。
- 删除区间在内部: 且 ,保留 和 (被切成两段)。
但上述 5 种情况可以合并为更简洁的逻辑:
对于每个区间 :
- 如果 :保留 (左半部分)。
- 如果 :保留 (右半部分)。
- 其余部分被删除。
2. 具体步骤
第 1 步:初始化结果列表 。
第 2 步:遍历每个区间 :
- 如果 :保留左半部分 。
- 如果 :保留右半部分 。
第 3 步:返回 。
3. 结合示例走一遍
- : → 保留 。 → 不保留右半。
- : → 不保留左半。 → 不保留右半。全部删除。
- : → 不保留左半。 → 保留 。
结果 。
思路 1:代码
class Solution:
def removeInterval(self, intervals: List[List[int]], toBeRemoved: List[int]) -> List[List[int]]:
dl, dr = toBeRemoved
ans = []
for l, r in intervals:
# 保留左半部分(不与删除区间重叠的部分)
if l < dl:
ans.append([l, min(r, dl)])
# 保留右半部分(不与删除区间重叠的部分)
if r > dr:
ans.append([max(l, dr), r])
return ans思路 1:复杂度分析
- 时间复杂度:,其中 是区间数量。只需一次遍历。
- 空间复杂度:,不考虑存储结果所需的空间。