无序数组计算排序后最大相邻差

如题目所示,给定数组[2,6,3,4,5,10,9],排序后的最大相邻差为9-6=3。想必你想到的方法是先运用冒泡或者快速排序,先将数组进行排序,然后循环求出来最大相邻差。这个时间复杂度为nlogn。
我们可以使用桶排序的方式计算最大相邻差,其中这个最大相邻差为右桶的最小值减去左桶的最大值。
桶的个数为数组的个数,桶的取值步长为(maxvalue-minvalue)/(len(array)-1)
形如
在这里插入图片描述
最大距离差为9min-6max=3

python 代码如下

class Bucket():
    def __init__(self) -> None:
        self.min = None
        self.max = None


def get_max_dinstinct(array: list = []):
    max_value = array[0]
    min_value = array[0]
    for i in range(0,len(array)):
        if array[i]>max_value:
            max_value=array[i]
        if array[i]<min_value:
            min_value=array[i]
            
    d = max_value-min_value
    if d==0:
        return 0
    # 初始化桶
    bucket_num = len(array)
    buckets = []
    for i in range(bucket_num):
        buckets.append(Bucket())
        
    # 遍历原始数组,确定每个桶的最大最小值
    for i in range(0,len(array)):
        # 确定数组元素所属的桶下表
        index = int((array[i]-min_value)*(bucket_num-1)/d)
        if buckets[index].min is None or array[i]<buckets[index].min:
            buckets[index].min = array[i]
        if buckets[index].max is None or array[i]>buckets[index].max:
            buckets[index].max = array[i]
    # 遍历桶计算最大距离
    left_max = buckets[0].max
    max_distinct = 0
    
    for _,value in enumerate(buckets):
        if value.min is None:
            continue
        if value.min-left_max>max_distinct:
            max_distinct = value.min-left_max
        left_max = value.max
        
    return max_distinct


print(get_max_dinstinct([2,6,5,4,3,10,9]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值