Leetcode 164 数组最大间隔(线性复杂度实现)//Python
Posted sanshibayuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 164 数组最大间隔(线性复杂度实现)//Python相关的知识,希望对你有一定的参考价值。
LeetCode 地址:https://leetcode.com/problems/maximum-gap/description/
题目描述
给定一个未排序数组,找出排序后的元素之间的最大间隔。
要求用线性时间复杂度实现。
例如:输入为【3,6,9,1,10】,输出应为最大间隔3。
题目分析
线性时间复杂度实现,就说明不能先对元素进行排序,因为采用此法复杂度为O(n?log(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)))
以上是关于Leetcode 164 数组最大间隔(线性复杂度实现)//Python的主要内容,如果未能解决你的问题,请参考以下文章