My Python wdrożenie rozwiązania 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
używam tuple
elementów w wiaderku, None
jeśli pusty. W ostatniej części eliminuję zapobiegawczo wszelkie pozostałe puste wiadra przypisując je poprzedniej (działa to, ponieważ pierwsza z nich jest gwarantowana, że nie jest pusta).
Zwróć uwagę na specjalny przypadek, gdy wszystkie elementy są równe.
O (n) czas i ile miejsca? – Jon
Gdzie (n) jest liczba elementów w wektorze? Tak, można to zrobić za pomocą dość podstawowej pętli. –
@MatsPetersson - Ale poprosił o ładną pętlę C++. –