![]() |
1
0
对间隔进行排序,按起点排序一次,按终点排序一次。 现在,给定一个区间,使用按终点排序的区间中的起点执行二进制搜索。你得到的索引告诉你之前有多少个非重叠区间:在区间开始之前结束的所有区间都是非重叠的。 对终点做同样的操作:在按起点排序的区间数组中进行二进制搜索。间隔结束后开始的所有间隔都是不重叠的。 所有其他间隔要么在间隔结束之前开始,但在间隔开始之后;要么在间隔开始后结束,但在它之前开始。 对每个间隔执行此操作,并对结果求和。一定要减半,不要把间隔数两次。如下所示:
总的来说,你会得到O(n-logn):两个排序,O(n)乘以两个O(logn)二进制搜索。 现在观察到,这一半甚至不需要——如果a和b不重叠,那么如果b计算之前的间隔就足够了;a不需要计算它之后的间隔,并且丢弃一半的代码。然后简化为:
对称地,您也可以只计算间隔之后的间隔。 |
![]() |
2
0
您可以对列表进行排序并进行二进制搜索(使用
打印:
编辑:如果您只想计数:
打印:
|
![]() |
3
0
我能想到的加快速度的一种方法是,只要满足条件,就停止内部循环,并为所有剩余元素加一,同时确保列表按每个元组对的第二个值和第一个值排序:
尽管我想@Luatics使用二进制搜索的解决方案可能对大列表更快。 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 7 月前 |
![]() |
bairog · 从按属性筛选的对象数组字典中创建值数组 7 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 8 月前 |
![]() |
Geremia · 2D NumPy数组+1D数组? 8 月前 |
![]() |
MARTIN · 交换第一个和最后一个单词,反转所有中间的字符 9 月前 |
![]() |
Paul Williams · 迭代数组时输出有问题 9 月前 |