给定一组对象,每个对象放置在自然数字行的多个位置:找到包含所有对象的最小间隔[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:请注意,可以将多个对象放置在同一位置。
答案 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),因为您只需添加一次位置的元素,然后删除它们一次。
您需要使用哈希来计算唯一元素。