该题解首先对区间列表进行排序,先根据区间的右端点降序排序,然后再根据左端点升序排序。这样排序后,对于任意相邻的两个区间,如果左区间被右区间覆盖,则左区间一定在右区间的前面。接着,初始化两个变量left和right分别记录当前考察的区间的左右端点。遍历排序后的区间列表,对于每个区间,如果它的左端点大于等于left且右端点小于等于right,则说明它被当前考察的区间覆盖,计数器ans增加1。如果当前区间的左端点小于等于right且右端点大于等于right,则更新right为当前区间的右端点。如果当前区间的左端点大于right,则更新left和right为当前区间的左右端点。最后,返回区间总数减去被覆盖的区间数。
时间复杂度: O(nlogn)
空间复杂度: O(1)
class Solution:
def removeCoveredIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x: x[1], reverse=True) # 根据右端点降序排序
intervals.sort(key=lambda x: x[0]) # 根据左端点升序排序
left = intervals[0][0] # 初始化left为第一个区间的左端点
right = intervals[0][1] # 初始化right为第一个区间的右端点
ans = 0
for i in range(1, len(intervals)):
interval = intervals[i]
if interval[0] >= left and interval[1] <= right:
ans += 1 # 如果当前区间被覆盖,则计数器增加
if interval[0] <= right and interval[1] >= right:
right = interval[1] # 更新right为当前区间的右端点
if interval[0] > right:
left = interval[0] # 更新left为当前区间的左端点
right = interval[1] # 更新right为当前区间的右端点
return len(intervals) - ans # 返回区间总数减去被覆盖的区间数