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
posted @ 2019-07-13 21:41  NeoZy  阅读(140)  评论(0编辑  收藏  举报