|
| 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