1288. 删除被覆盖区间
大约 3 分钟
---
1288. 删除被覆盖区间
- 标签:数组、排序
- 难度:中等
题目链接
题目大意
描述:给定一个区间列表 ,其中 。如果区间 被区间 覆盖(即 且 ),那么区间 就是冗余的。
要求:移除所有被其他区间覆盖的区间后,返回剩余区间的数量。
说明:
- 。
- 。
示例:
- 示例 1:
输入:intervals = [[1,4],[3,6],[2,8]]
输出:2
解释:[1,4] 和 [3,6] 都被 [2,8] 覆盖,移除后剩下 2 个。- 示例 2:
输入:intervals = [[1,4],[2,3]]
输出:1
解释:[2,3] 被 [1,4] 覆盖,移除后剩下 1 个。解题思路
思路 1:排序 + 贪心
1. 核心思想
判断一个区间是否被覆盖,需要看是否存在另一个区间左端点小于等于它且右端点大于等于它。
先对区间排序:按左端点升序排列,如果左端点相同,按右端点降序排列。
左端点升序意味着遍历时后面的区间左端点 前面的区间左端点。按右端点降序是为了处理左端点相同的情况:左端点相同时,右端点更大的区间会先出现,这样前面的区间会覆盖后面的区间。
遍历过程中,维护当前"覆盖范围"的最大右端点 。如果当前区间的右端点 ,说明被覆盖;否则,它是一个新的未被覆盖的区间。
2. 具体步骤
第 1 步:将 按左端点升序、右端点降序排序。
第 2 步:初始化 和 。
第 3 步:遍历每个区间 :
- 如果 :这是一个未被覆盖的区间,,。
- 否则():被覆盖,跳过。
第 4 步:返回 。
3. 结合示例走一遍
排序后(左升序,左相同则右降序):
遍历:
- : → ,
- : → ,
- : → 被覆盖,跳过
。
排序后:
遍历:
- : → ,
- : → 被覆盖,跳过
。
思路 1:代码
class Solution:
def removeCoveredIntervals(self, intervals: List[List[int]]) -> int:
# 按左端点升序,左端点相同则按右端点降序
intervals.sort(key=lambda x: (x[0], -x[1]))
count = 0
max_r = -1
for l, r in intervals:
if r > max_r:
count += 1
max_r = r
# else: 被覆盖,跳过
return count思路 1:复杂度分析
- 时间复杂度:,其中 是区间数量。排序需要 ,遍历需要 。
- 空间复杂度:,只使用了常数个变量。