題目描述:
給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。
如果陣列元素個數小於 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個桶,我...