Leetcode 164 数组最大间隔(线性复杂度实现)//Python

LeetCode 地址:https://leetcode.com/problems/maximum-gap/description/

题目描述

给定一个未排序数组,找出排序后的元素之间的最大间隔。

要求用线性时间复杂度实现。

例如:输入为【3,6,9,1,10】,输出应为最大间隔3。

题目分析

线性时间复杂度实现,就说明不能先对元素进行排序,因为采用此法复杂度为O(nlog(n))

思路是采用桶排序的方法。

首先,求随机数组中的最大元素 , 最小元素,为线性时间复杂度;

然后,在最大元素和最小元素之间,分配(N-1)个间隔,即为N个桶(bucket)。每个桶为一个有序实数对(None,None),将每个数依次往目标桶里塞。

其中,桶的上下界若已有元素(存在一个桶对应多个元素),则只需计算新元素与下界的较小值,同时计算其与上界的较大值,并将该最值作为新下界/上界即可;

最后,计算每个桶的下界与下一个桶的上节的差值。差值最大值即为最大间隔。

时间复杂度为O(n+b)O(n)

完整代码(Python)

def maximumGap(num):
    if len(num) < 2 or min(num) == max(num):
        return 0
    a, b = min(num), max(num)
    size = (b-a)//(len(num)-1) or 1
    bucket = [[None, None] for _ in range((b-a)//size+1)]
    for n in num:
        b = bucket[(n-a)//size]
        b[0] = n if b[0] is None else min(b[0], n)
        b[1] = n if b[1] is None else max(b[1], n)
    bucket = [b for b in bucket if b[0] is not None]
    return max(bucket[i][0]-bucket[i-1][1] for i in range(1, len(bucket)))

猜你喜欢

转载自www.cnblogs.com/Sanshibayuan/p/9105794.html