0
点赞
收藏
分享

微信扫一扫

面试中算法(无序数组排序后最大相邻差)

芭芭蘑菇 2024-05-09 阅读 37

     有一个无序整型数组,求该数组排序后的任意两个相邻元素的最大差值;要求时间复杂度和空间复杂度尽可能低。

  优化方法:使用桶排序的思想(不直接进行桶排序),可以做到时间复杂度O(N),空间复杂度O(N)。 

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

def get_max_sub2(ll):
    #1.获取最大值和最小值
    max_v=max(ll)
    min_v=min(ll)
    d=max_v-min_v
    # print(max_v,min_v)
    #如果等于0,则返回0
    if d==0:
        return 0

    #2.初始化桶
    bucket_len=len(ll)
    buckets=[]
    for i in range(bucket_len):
        buckets.append(Bucket())
        print(buckets[i].max,buckets[i].min)
    #3.循环原数列,确定每个桶的最大值和最小值
    for i in range(len(ll)):
        #确定数组元素桶的下标
        index=int((ll[i]-min_v)*(bucket_len-1)/d)
        #判断最大值为空或桶的最大值小于原数列
        if buckets[index].max is None or buckets[index].max<ll[i]:
            buckets[index].max=ll[i]
        if buckets[index].min is None or buckets[index].min>ll[i]:
            buckets[index].min=ll[i]
        print(index,buckets[index].max,buckets[index].min)

    #4.循环桶,找最大差值
    #默认左边的第一个最大
    leftMax=buckets[0].max
    # 最大差
    dis_max=0
    #循环从第2个开始
    for i in range(1,len(buckets)):
         #如果最小值为空,继续循环
         if buckets[i].min is None:
             continue
         #如果最小值-第1个最大值大于最大差
         if buckets[i].min-leftMax>dis_max:
             dis_max=buckets[i].min-leftMax
         #获取到最大值
         leftMax=buckets[i].max

    return dis_max



if __name__ == '__main__':
    ll=[22,26,25,21,28,20,34]
    print(ll)
    print('-'*20)
    print("最大差值:",get_max_sub2(ll))

 

举报

相关推荐

0 条评论