题解采用了桶排序的思路来解决问题。首先,如果数组长度小于2,直接返回0。计算数组最小值mn和最大值mx。接着计算桶的大小d,这是基于最大值和最小值的差以及数组长度来决定的,确保至少有一个元素在每个桶中。桶的数量计算基于(d + 1)来保证所有值都能放入桶中。每个桶用来存储该桶中的最小值和最大值。遍历数组,将每个元素放入相应的桶并更新该桶的最小值和最大值。最后,遍历所有桶,计算相邻非空桶之间的最大差值,即前一个桶的最大值和后一个桶的最小值之间的差。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def maximumGap(self, nums: List[int]) -> int:
n = len(nums)
if n < 2:
return 0 # 数组长度小于2时,无间距
mn, mx = min(nums), max(nums) # 找到数组的最小值和最大值
d = max(1, (mx - mn) // (n - 1)) # 计算桶的间距
size = (mx - mn) // d + 1 # 计算需要的桶的数量
buckets = [[-1] * 2 for _ in range(size)] # 初始化桶
for x in nums:
i = (x - mn) // d # 计算元素应该放入哪个桶
if buckets[i][0] == -1:
buckets[i][0] = buckets[i][1] = x # 初始化桶
else:
buckets[i][0] = min(buckets[i][0], x) # 更新桶的最小值
buckets[i][1] = max(buckets[i][1], x) # 更新桶的最大值
prev = -1
ans = 0
for i, (a, b) in enumerate(buckets):
if a == -1:
continue # 跳过空桶
if prev != -1:
ans = max(ans, a - buckets[prev][1]) # 计算相邻非空桶间的最大差值
prev = i
return ans # 返回最大间距