📅  最后修改于: 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)$。