leetcode164. 最大間距

給定一個無序的數組,找出數組在排序之後,相鄰元素之間最大的差值。

如果數組元素個數小於 2,則返回 0。
示例 1:
輸入: [3,6,9,1]
輸出: 3
解釋: 排序後的數組是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。
示例 2:
輸入: [10]
輸出: 0
解釋: 數組元素個數小於 2,因此返回 0。
說明:
你可以假設數組中所有元素都是非負整數,且數值在 32 位有符號整數範圍內。
請嘗試在線性時間複雜度和空間複雜度的條件下解決此問題。

要用線性的時間複雜度和空間複雜度,所以想到了桶排序。桶排序根據元素區間將元素放進一個個桶裏面分別排序,主要適用於小範圍整數數據,且數據獨立均勻分佈。步驟:1.設置固定數量的桶;2.將數據放入桶中;3.對每個桶排序;4.合併得到最終排序結果。

class Solution:
    def maximumGap(self, nums: List[int]) -> int:
        if len(nums) < 2:
            return 0
        min_num, max_num, len_num = min(nums), max(nums), len(nums)
        cap = (max_num-min_num)//len_num + 1  # 每個桶容量
        bucket_n = (max_num-min_num)//cap + 1  # 桶個數
        if bucket_n == 1:
            return max_num-min_num
        res = [[max_num+1, min_num-1] for _ in range(bucket_n)]  # 每個桶的最小最大值
        for num in nums:  # 記錄每個桶的最大最小值
            loc = (num-min_num) // cap
            res[loc][0] = min(num, res[loc][0])
            res[loc][1] = max(num, res[loc][1])
        ret, before_right = 0, max_num+1
        for one in res:  # 最大間距一定出現在兩桶之間
            if one[0] == max_num+1:
                continue
            if before_right != max_num+1:
                ret = max(ret, one[0]-before_right)
            before_right = one[1]
        return ret
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章