包含所有对象的最小间隔

时间:2013-12-01 08:03:48

标签: algorithm data-structures

给定一组对象,每个对象放置在自然数字行的多个位置:找到包含所有对象的最小间隔[a, b]

示例:考虑3个对象A, B, C

A位于1, 5, 7
B位于2, 4, 6
C位于4, 8, 9

包含所有三个对象的最小间隔是[4, 5]

我只能想到O(S^2)解决方案,其中S是包含所有对象位置的最小间隔,即[1, 9]

有更好的方法吗?

PS:请注意,可以将多个对象放置在同一位置。

2 个答案:

答案 0 :(得分:1)

按升序(nlogn time)对所有数据点进行排序 从左侧遍历这些数据点。

跟踪以下内容:
1.对于每种类型的对象,维护找到的最后一个对象的坐标条目(可能通过哈希图进行快速操作) 2.到目前为止发现的最小间隔长度 3.列表中最早元素的坐标。这是为了跟踪当前间隔的开始。

每当遇到物体时,
1.更新维护列表中的条目 2.检查最早元素的坐标是否已更新。如果是,则计算新的间隔长度,并在新的间隔长度较小时更新最小间隔长度。

首先需要确定您遇到了所有类型的对象,以计算第一个有效的最小间隔长度。你可以通过一个柜台来做到这一点。

如果不同类型的元素的数量有界且很小,则复杂度的顺序为O(nlogn),其中n是数据点的总数。

答案 1 :(得分:0)

您可以在浏览列表时使用2个索引在O(N)中执行此操作。 (让我们左右呼叫)。

你从位置1开始,然后向右递增,直到[left,right]包含所有元素。你知道这是从左边开始的具有所有元素的最小间隔。现在向左递增。现在再次增加直到你拥有所有元素。 (注意,很多时候你甚至不必增加)。从所有完整的时间间隔中获得最低限度,您就得到了答案。

这是有效的,因为如果你知道[left,right]是从左边开始的最小间隔,从左+ 1开始的间隔将是右边的> =最后一个右边。

这是O(N),因为您只需添加一次位置的元素,然后删除它们一次。

您需要使用哈希来计算唯一元素。