您会收到一些汽车在高速公路上的位置,这些位置表示为双精度浮点数存储在一个向量中,但没有特定的顺序。如何以O(n)时间复杂度找到相邻汽车之间的最大间隔?
看起来简单的解决方案是先排序,然后检查,但是显然这不是线性时间复杂度。
您会收到一些汽车在高速公路上的位置,这些位置表示为双精度浮点数存储在一个向量中,但没有特定的顺序。如何以O(n)时间复杂度找到相邻汽车之间的最大间隔?
看起来简单的解决方案是先排序,然后检查,但是显然这不是线性时间复杂度。
Bucket: 2 6 10 14 18 20
Min/Max: 2-5 - - 17,17 20,20
差异: 2-5, 5-17, 17-20. 最大值为 5-17。
我对ipc的解决方案进行了Python实现:
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
我使用元组
来表示桶的元素,如果为空则使用None
。在最后一部分,我通过将剩余的空桶分配给前一个桶来预先消除任何剩余的空桶(这是可行的,因为第一个桶保证不为空)。
请注意当所有元素都相等时的特殊情况。