Skip to content

Commit 61a067d

Browse files
committed
maximum gap
1 parent 587f070 commit 61a067d

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

maximumGap.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# @param num, a list of integer
2+
# @return an integer
3+
# @link http://cgm.cs.mcgill.ca/~godfried/teaching/dm-reading-assignments/Maximum-Gap-Problem.pdf
4+
def maximumGap(num):
5+
length = len(num)
6+
if length < 2:
7+
return 0
8+
elif length == 2:
9+
return num[0] - num[1] if num[0] > num[1] else num[1] - num[0]
10+
11+
# find max and min
12+
maximum = minimum = num[0]
13+
for item in num:
14+
if item > maximum:
15+
maximum = item
16+
elif item < minimum:
17+
minimum = item
18+
19+
# split buckets
20+
span = (maximum - minimum) * 1.0 / (length - 1)
21+
buckets = [[] for i in range(length - 1)]
22+
buckets[0] = [minimum, minimum]
23+
buckets[length - 2] = [maximum, maximum]
24+
for item in num:
25+
if item == maximum:
26+
continue
27+
index = int((item - minimum) / span)
28+
if len(buckets[index]) == 0:
29+
buckets[index] = [item, item]
30+
else:
31+
if buckets[index][0] > item:
32+
buckets[index][0] = item
33+
elif buckets[index][1] < item:
34+
buckets[index][1] = item
35+
36+
# find max gap
37+
maximumGap = 0
38+
previousMax = minimum
39+
for bucket in buckets:
40+
if len(bucket) == 0:
41+
continue
42+
gap = bucket[0] - previousMax
43+
if gap > maximumGap:
44+
maximumGap = gap
45+
previousMax = bucket[1]
46+
47+
return maximumGap
48+
49+
50+
assert maximumGap([]) == 0
51+
assert maximumGap([1]) == 0
52+
print maximumGap([1, 100000])
53+
assert maximumGap([1, 100000]) == 99999
54+
assert maximumGap([1, 2, 3, 4, 6, 7, 8]) == 2
55+
assert maximumGap([5, 4, 1, 2, 8.5, 3]) == 3.5

0 commit comments

Comments
 (0)