39 最大間距

2021-09-28 20:49:38 字數 1831 閱讀 6089

題目描述:

給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。

如果陣列元素個數小於 2,則返回 0。

示例 1:

輸入: [3,6,9,1]

輸出: 3

解釋: 排序後的陣列是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。

示例 2:

輸入: [10]

輸出: 0

解釋: 陣列元素個數小於 2,因此返回 0。

說明:

畫粗的才是重點!!!

如何使用線性的時間和空間複雜度呢???

使用桶排序

新增鏈結描述

新增鏈結描述

class solution 

public int maximumgap(int nums)

int min = integer.max_value;

int max = integer.min_value;

for (int i : nums)

// 分配桶的長度和個數是桶排序的關鍵

// 在 n 個數下,形成的兩兩相鄰區間是 n - 1 個,比如 [2,4,6,8] 這裡

// 有 4 個數,但是只有 3 個區間,[2,4], [4,6], [6,8]

// 因此,桶長度 = 區間總長度 / 區間總個數 = (max - min) / (nums.length - 1)

int bucketsize = math.max(1, (max - min) / (nums.length - 1));

// 上面得到了桶的長度,我們就可以以此來確定桶的個數

// 桶個數 = 區間長度 / 桶長度

// 這裡考慮到實現的方便,多加了乙個桶,為什麼?

// 還是舉上面的例子,[2,4,6,8], 桶的長度 = (8 - 2) / (4 - 1) = 2

// 桶的個數 = (8 - 2) / 2 = 3

// 已知乙個元素,需要定位到桶的時候,一般是 (當前元素 - 最小值) / 桶長度

// 這裡其實利用了整數除不盡向下取整的性質

// 但是上面的例子,如果當前元素是 8 的話 (8 - 2) / 2 = 3,對應到 3 號桶

// 如果當前元素是 2 的話 (2 - 2) / 2 = 0,對應到 0 號桶

// 你會發現我們有 0,1,2,3 號桶,實際用到的桶是 4 個,而不是 3 個

// 透過例子應該很好理解,但是如果要說根本原因,其實是開閉區間的問題

// 這裡其實 0,1,2 號桶對應的區間是 [2,4),[4,6),[6,8)

// 那 8 怎麼辦?多加乙個桶唄,3 號桶對應區間 [8,10)

bucket buckets = new bucket[(max - min) / bucketsize + 1];

for (int i = 0; i < nums.length; ++i)

buckets[loc].min = math.min(buckets[loc].min, nums[i]);

buckets[loc].max = math.max(buckets[loc].max, nums[i]);

}int previousmax = integer.max_value; int maxgap = integer.min_value;

for (int i = 0; i < buckets.length; ++i)

if (buckets[i] != null)

}return maxgap;

}}

LeetCode 最大間距

給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。示例 1 輸入 3,6,9,1 輸出 3 解釋 排序後的陣列是 1,3,6,9 其中相鄰元素 3,6 和 6,9 之間都存在最大差值 3。示例 2 輸入 10 輸出 0 解釋 陣列元素個數小於 2,...

164 最大間距

給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。示例 1 輸入 3,6,9,1 輸出 3 解釋 排序後的陣列是 1,3,6,9 其中相鄰元素 3,6 和 6,9 之間都存在最大差值 3。思路 注釋 public static int maximu...

164 最大間距

開始想的是計數排序,但超時,如 2,999999999 這樣的樣例,記錄陣列太長,有用的佔比太少。後看官方思路,用n 1 n為原陣列元素個數 個桶去篩元素,每個桶能放的元素大小範圍固定,即下面 中的step,處理完後再掃瞄一遍當前桶最大和後繼桶最小值的差,取最大差值為結果。至於為什麼要n 1個桶,我...