您可以在高速公路的同一车道上获得各种车辆的位置,而不是特定的顺序。如何在O(n)时间内找到相邻车辆之间的最大差距?
似乎一个简单的解决方案就是排序然后检查,但当然这不是线性的。
答案 0 :(得分:7)
将矢量除以n + 1个相同大小的桶。对于每个这样的桶,存储最大值和最小值,可以丢弃所有其他值。由于鸽笼原理,这些部分中至少有一个是空的,因此任一部分的非最小值/非最大值对结果没有影响。
然后,遍历水桶并计算到下一个和前一个非空桶的距离,并取最大值;这是最终的结果。
n = 5且值为5,2,20,17,3的示例。最小值为2,最大值为20 =>铲斗尺寸为(20-2)/ 5 = 4。
Bucket: 2 6 10 14 18 20
Min/Max: 2-5 - - 17,17 20,20
差异:2-5,5-17,17-20。 最高为5-17。
答案 1 :(得分:0)
我的Python实现ipc的解决方案:
def maximum_gap(l):
n = len(l)
if n < 2:
return 0
(x_min, x_max) = (min(l), max(l))
if x_min == x_max:
return 0
buckets = [None] * (n + 1)
bucket_size = float(x_max - x_min) / n
for x in l:
k = int((x - x_min) / bucket_size)
if buckets[k] is None:
buckets[k] = (x, x)
else:
buckets[k] = (min(x, buckets[k][0]), max(x, buckets[k][1]))
result = 0
for i in range(n):
if buckets[i + 1] is None:
buckets[i + 1] = buckets[i]
else:
result = max(result, buckets[i + 1][0] - buckets[i][1])
return result
assert maximum_gap([]) == 0
assert maximum_gap([42]) == 0
assert maximum_gap([1, 1, 1, 1]) == 0
assert maximum_gap([1, 2, 3, 4, 6, 8]) == 2
assert maximum_gap([5, 2, 20, 17, 3]) == 12
我使用tuple
作为广告素材的元素,None
如果为空。在最后一部分中,我通过将任何剩余的空桶分配给前一个空桶来预先消除(这是有效的,因为第一个空桶确保非空)。
注意所有元素相等的特殊情况。