標籤:ems tps 複雜 最大 class strong [1] 最大值 https
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