給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。
如果陣列元素個數小於 2,則返回 0。
示例 1:
輸入: [3,6,9,1]
輸出: 3
解釋: 排序後的陣列是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。
示例 2:
輸入: [10]
輸出: 0
解釋: 陣列元素個數小於 2,因此返回 0。
題目要求時間複雜度為o(n)
利用桶排序
假設陣列中最大值和最小值分別為max
,min
我們可以知道相鄰最大間距不會小於(max - min) / (n - 1)
所以將每個桶的大小設定為(max - min) / (n - 1)
,這樣就不用考慮桶內的距離大於最終結果
只需要看前乙個桶的最大值和當前桶的最小值的差值,保留住最大差值
class
solution
// 找出最大值和最小值
int max = integer.min_value, min = integer.max_value;
for(
int num : nums)
// 特殊情況: 所有數字一樣
if(max - min ==0)
// 存放每個桶的最小值
int[
] bucketmin =
newint
[n -1]
; arrays.
fill
(bucketmin, integer.max_value)
;// 存放每個桶的最大值
int[
] bucketmax =
newint
[n -1]
; arrays.
fill
(bucketmax, integer.min_value)
;// 確定桶的間距
int interval =
(int
) math.
ceil((
double
)(max - min)
/(n -1)
);// 將數放入桶
for(
int num : nums)
int index =
(num - min)
/ interval;
// 更新每個桶的最大最小值
bucketmax[index]
= math.
max(bucketmax[index]
, num)
; bucketmin[index]
= math.
min(bucketmin[index]
, num);}
int maxgap =0;
int premax = min;
// 前乙個桶的最大值
for(
int i =
0; i < n -
1; i++
) maxgap = math.
max(maxgap, bucketmin[i]
- premax)
; premax = bucketmax[i];}
// 別忽略最後乙個數(最後乙個數沒放進桶)
return math.
max(maxgap, max - premax);}
}
LeetCode 164 最大間距
給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。示例 1 輸入 3,6,9,1 輸出 3解釋 排序後的陣列是 1,3,6,9 其中相鄰元素 3,6 和 6,9 之間都存在最大差值 3。示例 2 輸入 10 輸出 0解釋 陣列元素個數小於 2,因此...
leetcode 164 最大間距
給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。第一時間想到的也是最簡單的,先將所給陣列排序,再遍歷一遍陣列找出最大間距 複雜度分析 首先我們來了解一下桶排序的思想。桶排序是體現了分治的思想。原理是建立若干個桶,通過某種對映將待排序的元素放置到桶...
leetcode 164 最大間距
目錄 一 題目內容 二 解題思路 三 給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。示例 1 輸入 3,6,9,1 輸出 3 解釋 排序後的陣列是 1,3,6,9 其中相鄰元素 3,6 和 6,9 之間都存在最大差值 3。示例 2 輸入 10 ...