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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值