1、问题
给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。
2、题解:
我们用桶来做,非基于比较的排序有三种:计数、桶、基数。
思路:
思路:
有n个数,分n+1个桶(鸽笼原理:中间一定有个空桶。相邻两数的最大值一定在两个非空的桶中,不可能来自同一个桶)
设置三个数组,分别装桶中的是否为空、最大值、最小值,然后遍历求出最大差值。
步骤:
步骤:
1、先判断特例,数组为空或只有一个元素:返回0
2、遍历,求出最小值和最大值,如果相等,说明这个数组中的元素全部相等,返回0
3、设置两个数组,分别放这个桶中的最大值maxtong、最小值mintong,设置hasNum数组,表示桶是否是空;遍历,求出这三个数组
4、设置一个变量lastmax,保存上个非空桶中的最大值;然后遍历,遇到非空桶,更新最大差值和lastmax
Python代码如下:
def maxGap(nums):
if not nums or len(nums) < 2:
return 0
n = len(nums)
min_num,max_num = float('inf'),float('-inf')
for num in nums:
min_num = min(min_num,num)
max_num = max(max_num,num)
if max_num == min_num:
return 0
hashNum = [False for _ in range(n + 1)]
maxs,mins = [0 for _ in range(n + 1)],[0 for _ in range(n + 1)]
for i in range(len(nums)):
bid = bucket(nums[i],n,min_num,max_num)
mins[bid] = min(nums[i],mins[bid]) if hashNum[bid] else nums[i]
maxs[bid] = max(nums[i],maxs[bid]) if hashNum[bid] else nums[i]
hashNum[bid] = True
res,lastMax = 0,maxs[0]
for i in range(1,n+1):
if hashNum[i]:
res = max(res,mins[i] - lastMax)
lastMax = maxs[i]
return res
def bucket(num,n,min_num,max_num):
return int((num - min_num) * n /(max_num - min_num))
nums = [ 1,3,2,9,5]
print(maxGap(nums))
3、复杂度分析:
时间复杂度:O(N)
空间复杂度:O(N)