Leetcode 164 數組最大間隔(線性複雜度實現)//Python

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.