高频面试题(利用桶的思想):给定一个数组,求如果排序之后,相邻两数的最大差值

1、问题

给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。

2、题解:

我们用桶来做,非基于比较的排序有三种:计数、桶、基数。
思路:

思路:
有n个数,分n+1个桶(鸽笼原理:中间一定有个空桶。相邻两数的最大值一定在两个非空的桶中,不可能来自同一个桶)
设置三个数组,分别装桶中的是否为空、最大值、最小值,然后遍历求出最大差值。

步骤:

步骤:
1、先判断特例,数组为空或只有一个元素:返回0
2、遍历,求出最小值和最大值,如果相等,说明这个数组中的元素全部相等,返回0
3、设置两个数组,分别放这个桶中的最大值maxtong、最小值mintong,设置hasNum数组,表示桶是否是空;遍历,求出这三个数组
4、设置一个变量lastmax,保存上个非空桶中的最大值;然后遍历,遇到非空桶,更新最大差值和lastmax

Python代码如下:

def maxGap(nums):
    if not nums or len(nums) < 2:
        return 0
    n = len(nums)
    min_num,max_num = float('inf'),float('-inf')
    for num in nums:
        min_num = min(min_num,num)
        max_num = max(max_num,num)
    if max_num == min_num:
        return 0
    hashNum = [False for _ in range(n + 1)]
    maxs,mins = [0 for _ in range(n + 1)],[0 for _ in range(n + 1)]
    for i in range(len(nums)):
        bid = bucket(nums[i],n,min_num,max_num)
        mins[bid] = min(nums[i],mins[bid]) if hashNum[bid] else nums[i]
        maxs[bid] = max(nums[i],maxs[bid]) if hashNum[bid] else nums[i]
        hashNum[bid] = True
    res,lastMax = 0,maxs[0]
    for i in range(1,n+1):
        if hashNum[i]:
            res = max(res,mins[i] - lastMax)
            lastMax = maxs[i]
    return res

def bucket(num,n,min_num,max_num):
    return int((num - min_num) * n /(max_num - min_num))

nums = [ 1,3,2,9,5]
print(maxGap(nums))

3、复杂度分析:

时间复杂度:O(N)
空间复杂度:O(N)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值