查找一组间隔的覆盖范围

时间:2015-05-19 01:48:27

标签: algorithm intervals

我在准备接受采访时遇到了这个问题并认为这是一个有趣的问题需要解决。问题是这样的: 查找一组间隔的覆盖范围 例如 - 给定[1,4],[ - 2,3],[9,10]:输出应为7(间隔集合覆盖-2,-1,0,1,2,3,9)

我最初的方法是迭代一组间隔;将每个间隔中的数字添加到“已排序的链接”列表中。如果已排序列表中已存在任何数字,请跳过它。我相信这需要O(N ^ 2)时间并消耗O(N)空间,所以我们可能会做得更好。

或者,我们可以使用Interval BST。然而,这似乎主要用于找出是否存在与给定间隔重叠(采用O(lgn))。找到它的覆盖范围似乎再次需要O(n ^ 2)。我们能做得比O(n ^ 2)好吗?

1 个答案:

答案 0 :(得分:1)

您可以将它们视为成对并按第一个元素对它们进行排序。

排序后,您将拥有:{< -2,2>,< 1,3>,< 9,9>}。

排序将采用O(NlogN)。

现在变量sum = 0。

然后设L =(1).left和R =(1).right。

线性遍历保持您遇到的最大R的一切,直到R< (k).left,然后求和+ = abs(L - R)+ 1并继续进行如上所述的其余部分。这将需要大约O(N)。所以,总共:O(NlogN + N)~O(NlogN)。

空间也是线性的。

reload

P.S。我还没有对代码进行全面测试,但似乎有效。