給定一個無序的數組,找出數組在排序之後,相鄰元素之間最大的差值。
如果數組元素個數小於 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