桶排序的思想,一共有n個數,如果放進大於等於n個桶裏面,最大間隔將從桶的間隔中取。如果要放進大於等於n個桶裏,那麼桶的增量應該怎麼取。
首先要把n個數字去除重複的數字,然後將最大值減去最小值也就是累計的增量,由於最少要設置n個桶,那麼一共增加n-1次,可以讓增量爲(最大值-最小值)/(n-1)取整,桶的個數即爲(最大值-最小值)/(n-1)加一後向上取整。
class Solution:
def maximumGap(self, nums: List[int]) -> int:
nums=list(set(nums))
n=len(nums)
if n<2:
return 0
max_num,min_num=max(nums),min(nums)
if max_num==min_num:return 0
b=(max_num-min_num)//(n-1)
k=math.ceil((max_num-min_num)//b+1)
h=[[] for i in range(k)]
for num in nums:
h[(num-min_num)//b].append(num)
res=0
for i in range(k):
if len(h[i])!=0:
mi=min(h[i])
if i>0:
res=max(res,mi-ma)
ma=max(h[i])
return res