164. 最大间距
开始想的是计数排序,但超时,如[2,999999999]这样的样例,记录数组太长,有用的占比太少。后看官方思路,用n+1(n为原数组元素个数)个桶去筛元素,每个桶能放的元素大小范围固定,即下面代码中的step,处理完后再扫描一遍当前桶最大和后继桶最小值的差,取最大差值为结果。至于为什么要n+1个桶,我是为了方便计算,我是用(原数组各元素-min)/step的结果直接作为它的桶号,但桶数也不能小于n-1,形象点说就是n个数每两个数中间一个桶,这样n-1个桶正好,再少的话可能最大相邻元素差值就出现在一个桶中里。举个例子:[1,2,2.5,3],n=4,若取n-2=2个桶,1,2在第一个桶,2.5,3在第二个桶,最大差值出现在1,2间,但它们是一个桶里的,不符合我们算法的要求。
class Solution:
def maximumGap(self, nums):
_len=len(nums)
if _len<2:
return 0
_min,_max=nums[0],nums[0]
for x in nums:
if _min>x:
_min=x
if _max<x:
_max=x
if _max-_min<=1:
return _max-_min
step=(_max-_min)/_len
temp=[[0 for i in range(3)] for j in range(_len+1)]
for x in nums:
i=int((x-_min)//step)
#i为当前元素应放置的桶号
if temp[i][2]==0:
temp[i][2]=1
temp[i][0],temp[i][1]=x,x
else:
temp[i][0]=min(temp[i][0],x)
temp[i][1]=max(temp[i][1],x)
i=-1
res=0
for j in range(len(temp)):
if temp[j][2] and i==-1:
i=j
elif temp[j][2] and i!=-1:
res=max(res,temp[j][0]-temp[i][1])
i=j
return res
进击的小🐴农