给定一组间隔和一个时间t,找到包含该时间的一个间隔

时间:2018-11-29 01:00:16

标签: algorithm

间隔有开始和结束时间。 间隔可以重叠。可能有几个包含时间t的间隔。可以只返回其中之一。

这是一个面试问题。我能够通过根据结束时间对间隔进行排序,并根据开始对另一个时间进行排序,并采用具有匹配的开始和结束时间的间隔的交集来解决该问题。显然,有更多优化的解决方案。

这里是一个示例:[1,5] [2,10] [3,6] [2,9],目标是8。在这种情况下,[2,10]和[2,9]都是正确答案。

我想问题的重点是按间隔预先计算数据结构,以便可以以比线性更好的复杂性来运行搜索。

2 个答案:

答案 0 :(得分:0)

我找到了答案here,这个问题就像间隔树。

可以在许多资源中找到该解决方案,但是我发现上面提到的pdf非常简洁明了。

以下是答案的相关部分:

enter image description here

enter image description here

答案 1 :(得分:-1)

遍历时间间隔,直到找到一个在给定时间介于该时间间隔开始之间的时间间隔为止。您可以在找到的第一个停下来。最差的情况是O(n)。

编辑以添加 因为已对问题进行了编辑,以添加预先计算答案的建议

预先计算答案将假设每个时间间隔的时间都不会改变,并且时间间隔的集合也不会改变。问题中没有提到这一点,但以下内容基于该假设。

如果要预先计算结果,则需要在每个可能的小时中检查收集。您可以在 all 的整个24小时内执行此操作,或者(间隔一小段时间)可以列出的小时数是从开始时间的最小值到结束时间的最大值(因为所有其他小时将没有间隔),则花费O(n)来计算最小值和最大值。选择哪种方法将取决于您有多少间隔。如果 n 足够大,那么您将忽略计算最小值和最大值,并在所有24小时内进行计算,

对于每个可能的小时,您需要检查要匹配的第一个时间间隔的集合(最坏的情况是每个小时O(n)),并将其存储以供将来查找。

可以将它们存储为对间隔的引用数组,并使用小时作为索引,从而产生最坏情况下的O(1)查找成本。

因此,如果您进行了足够的查找,并且假设间隔永远不变,那么这将比每次计算都要快。