leetcode-164. 最大间距-桶排序-分而治之

知道的越多,不知道的越多(微信:Y17744650906)
点赞再看,养成习惯
164. 最大间距

**前言**:这道题的难点在于如何用线性的时空复杂度来解决。直接sort然后遍历数组当然可以解决问题,但是面试的时候这种解法肯定是不能让面试官满意的。

正文
桶排序的两个核心问题:

每个桶的长度是多少?换句话说,每个桶放置元素的范围是什么?
一共要准备多少个桶?
分析和解答:

我们期望将数组中的各个数等距离分配,也就是每个桶的长度相同,也就是对于所有桶来说,桶内最大值减去桶内最小值都是一样的。可以当成公式来记。
每个桶的长度 = (max - min) // ( len(nums) -1 )
确定桶的数量,最后的加一保证了数组的最大值也能分到一个桶。
桶的数量 = ( max - min ) // 桶的长度 + 1(加1保证最后一个元素放在桶里)

我们的做法是要将数组中的数放到一个个桶里面,不断更新更大的(后一个桶内元素的最小值 - 前一个桶内元素的最大值),最后就得到了答案。

如何确定每个数应该对应哪个桶?

每个元素所放的桶 = (nums[i] - min )// 桶的长度

举个栗子
nums = [1,3,4,5,6,10,11,12,17]
每个桶的长度 = (17 - 1) / (9-1) = 2
桶的个数 = (17-1)/ 2 + 1 = 9
所以我们的桶为(左闭右开):

区间 [1,3) [3,5) [5,7) [7,9) [9,11) [11,13) [13,15) [15,17) [17,19)
元素 1 3,4 5,6 10 11,12 17
差值 3-1 = 2 5-4 = 1 10-6 = 4 11-10 = 1 17-12 = 5
答案 = max(差值) = 5

class Solution:
    def maximumGap(self, nums: List[int]) -> int:
        if not nums or len(nums) < 2: return 0
        max_gap = 0
        min_ = min(nums)
        max_ = max(nums)
        each_bucket_len = max(1,(max_ -min_) // (len(nums) - 1))  #每个桶的长度
        buckets =[[] for _ in range((max_-min_) // each_bucket_len + 1)]

        for i in range(len(nums)):
            loc = (nums[i] - min_) // each_bucket_len
            buckets[loc].append(nums[i])
        
        pre_max = -1
        for i in range(len(buckets)):
            if buckets[i] and pre_max != -1:
                max_gap = max(max_gap , min(buckets[i]) - pre_max)
            if buckets[i]:
                pre_max = max(buckets[i])

        return max_gap


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坏孩子充电自习室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值