一尘不染

在O(n)时间中找到重叠的约会?

algorithm

最近在一次采访中有人问我这个问题。虽然我是上不来的 Øñ ²)的解决方案,面试官与一个痴迷 Øñ )解决方案。我还检查了我了解的
On log n )的其他解决方案,但是 On )解决方案仍然不是我的杯茶,它假定约会按开始时间排序。

有人可以解释吗?

问题陈述: 给您 n个 约会。每个约会都包含开始时间和结束时间。您必须有效地重新安排所有有冲突的约会。

人:1、2、3、4、5
应用开始:
2、4、29、10、22应用结束:5、7、34、11、36

答案:2x1 5x3

On log n )算法:像这样分开起点和终点:

2s,4s,29s,10s,22s,5e,7e,34e,11e,36e

然后对所有这些点进行排序(为简单起见,我们假设每个点都是唯一的):

2s,4s,5e,7e,10s,11e,22s,29s,34e,36e

如果我们有连续的起点而没有终点,那么它是重叠的:2s,4s相邻,所以有重叠

我们将保留一个“ s”的计数,每次遇到它都会+1,当遇到e时,我们将计数减少1。


阅读 234

收藏
2020-07-28

共1个答案

一尘不染

On )中 不可能 解决该问题。

至少需要按约会开始时间进行排序,这需要 On log n )。

如果列表已经排序,* 则有 On
)解决方案。该算法基本上涉及检查下一个约会是否被任何先前的约会重叠。这一点有些微妙,因为您在遍历列表时实际上需要两个指针到列表中:
*

  • 当前约会正在检查中
  • 迄今为止遇到的最晚结束时间的约会(可能不是先前的约会)

__仅当您有其他约束* (例如,固定数量的约会时隙)时, 可以 存在 未排序情况的 On
)个解决方案。如果是这种情况,则可以使用HashSets确定覆盖每个时隙的约会,算法大致如下:
*

  • 为每个时隙创建一个HashSet- O (1),因为时隙号是一个固定常数
  • 对于每个约会,将其ID号存储在它覆盖的插槽的HashSet中 -On ),因为对于每个约会更新恒定的时隙数为 O (1)
  • 在插槽中运行,检查是否有重叠 -O (1)(如果要遍历重叠的约会以将其作为结果返回,则为 On ))
2020-07-28