两个数组,一个有时间,另一个有时间

Two arrays one with time in, another with time out of something

假设我们有 2 个数组,其中一个(即 A)包含对象 i 进入房间的时间,另一个(即 B)包含timei会离开。这些都没有以任何方式排序,它们的内容是实数

例如,对象 3 具有:A[3]=0.785 和 B[3]=4.829。

你如何在 O(nlogn) 时间内找到房间中在任何给定时间 t 的最大对象数?

从两个数组中获取所有时间并配对{time from A or from B; f = +1 for A/ -1 for B}

按时间键对所有对的数组进行排序(如果平局 +1 在 -1 之前)

制作count = 0

遍历对数组,将 f 值添加到 count

count 的最大值是“房间中的最大对象数”

示例:

  A = [2, 5], B = [7, 9]
  pairs = (2,1),(5,1),(7,-1),(9,-1)
  count = 1, 2, 1, 0 
  maxcount=2 at interval 5..7

你可以试试这个:

  • 将对象数初始化为零
  • 对两个数组进行排序
  • 当任一数组中还有剩余元素时
    • 确定哪个数组的第一个值较小
    • 如果 "enter" 中的第一个值较小,则增加对象数并弹出该值
    • 如果 "leave" 中的第一个值较小,则减少对象的数量并弹出该值
    • 检查您是否找到了新的最大对象数

如果你不能"pop"个数组中的元素,你可以使用两个索引变量代替;另外,当其中一个数组已经为空时,您必须添加案例。

排序复杂度为 O(nlogn),接下来的循环复杂度为 O(2*n),因此总共为 O(nlogn)。