最大間隙問題
問題描述
最大間隙問題是指,給定n個實數,求這n個數在實軸上相鄰2個數之間的最大差值。假設對任何實數的下取整函數耗時,設計最大間隙問題的線性時間算法。
解題思路
第一種方法
先對n個數進行從小到大排序,然後依次計算相鄰兩個數之間的距離。採用這種方法,最優排序方法的計算複雜度爲,不滿足線性時間複雜度。但是這種方法實現起來比較簡單。
第二種方法:桶排序
- 找出數組中最大值max_val和最小值min_val。
- 每個桶的寬度爲size=(max_val-min_val)/(n-1),一共n+1個桶,最後一個桶存最大值,n個數放到n+1個桶,必然存在空桶,最大間距必然不來自同一個桶。
- 把每個數都放進各自的桶裏,nums[i]應該放到第(nums[i]-min_val)/size個桶裏,每個桶只存儲該桶內的最小值和最大值,格式爲[min, max]。
- 排除掉空桶後,求相鄰兩個桶內數字的最大距離,即第i個桶的最小值和第i-1個桶的最大值之間的差。
Python程序
- 第一種方法的Python程序:
nums = [2.3, 3.1, 7.5, 1.5, 6.3]
class Solution:
def maxmargin(self, nums):
if len(nums) < 2:
return 0
max_nums, min_nums = max(nums), min(nums)
if max_nums == min_nums:
return 0
sorted_nums = sorted(nums)
margin = []
for i in range(len(sorted_nums)):
mar = sorted_nums[i] - sorted_nums[i-1]
margin.append(mar)
return format(max(margin), '.1f')
s = Solution()
b = s.maxmargin(nums)
print(b)
輸出:
3.2
Process finished with exit code 0
- 第二種方法的Python程序
import math
class Solution:
def maximumGap(self, nums):
if len(nums) < 2:
return 0
max_val, min_val = max(nums), min(nums)
if max_val == min_val:
return 0
n = len(nums)
size = (max_val - min_val) / (n - 1)
bucket = [[None, None] for _ in range(n + 1)]
for num in nums:
b = bucket[math.floor((num - min_val) // size)]
b[0] = min(b[0], num) if b[0] else num
b[1] = max(b[1], num) if b[1] else num
bucket = [b for b in bucket if b[0] is not None]
return max(bucket[i][0] - bucket[i - 1][1] for i in range(1, len(bucket)))
nums = [2.3, 3.1, 7.5, 1.5, 6.3]
s = Solution()
b = s.maximumGap(nums)
print(format(b, '.1f'))
輸出:
3.2
Process finished with exit code 0
參考:
https://www.jianshu.com/p/dbb8056344ea