📜  要插入为间隔[0,R]的可用非重叠间隔的计数(1)

📅  最后修改于: 2023-12-03 15:11:55.807000             🧑  作者: Mango

描述

给定一个区间 $[0,R]$ 和 $n$ 个长度为 $l$ 的区间 $[s_i,e_i]$,其中$n$ 个区间可能会有重叠。现在需要求出在 $[0,R]$ 中插入能与原有区间非重叠的区间数量。

算法思路

对所有区间以 $e_i$ 为关键字从小到大排序,使用贪心算法,从第一个区间开始,比较当前区间与前一个区间是否有交集,若无交集则计数器加 $1$,否则不考虑。

代码实现
def non_overlapping_intervals(R, intervals):
    intervals.sort(key=lambda x: x[1])  # 根据右端点排序
    count, end = 0, -1  # 初始化计数器和结束标志
    for start, stop in intervals:
        if start > end:  # 没有交集
            end = stop  # 更新结束标志
            count += 1  # 计数器加 1
    return count
复杂度分析

在 Python 的内置排序算法中,Timsort 的时间复杂度为 $O(n\log n)$,遍历区间的时间复杂度为 $O(n)$,因此该算法的总时间复杂度为 $O(n\log n)$。