給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。首先建立桶,每個桶中只需要存放這個桶中元素的最大值和最小值。如果陣列元素個數小於 2,則返回 0。
leetcode
桶尺寸就是陣列中元素範圍再除以陣列的大小,桶的數量就是陣列範圍除以桶的尺寸再加一。
為什麼需要這樣規定桶的尺寸呢?因為這樣可以讓最大的間距的兩個元素在兩個不同的桶中。可以證明一下,因為我們用元素範圍之差除以元素個數,所以桶的尺寸就是平均的元素間距,顯然最大間距最大的元素不可能在同乙個桶。
為什麼要最大間距的元素在兩個不同的桶中呢?如果兩個元素在桶中,那就又需要再桶中進行排序求解了,這樣桶排序的優勢就沒了。
遍歷陣列,把元素放到桶中。這裡只需要乙個桶中元素的最大值和最小值,因為答案不會在乙個桶中,所以,只需要比較相鄰桶的邊界就能獲取答案,其餘的值只會礙事。
遍歷桶,用當前桶的最小值減去上乙個桶的最大值,就是可能的答案。
class
bucket
class
solution
// 計算桶的大小和數量
int size = math.
max(1,
(maxn - minn)
/(n -1)
);int bucketnum =
(maxn - minn)
/ size +1;
list
buckets =
newarraylist
<
>()
;for
(int i =
0; i < bucketnum; i++
) buckets.
add(
newbucket()
);// 把元素放到桶裡,只取桶中的最大值和最小值
for(
int num : nums)
int pre = minn, res =0;
// 遍歷桶,獲取最大間距
for(bucket b : buckets)
return res;
}}
亂序陣列的演算法
在做開發的時候,遇到了乙個問題,比如說我想要乙個陣列,比如說空間大小為10,裡面的數是1 10,不能重複。比如 8,9,2,4,5,7,1,3,6,10.順序都是亂的,且是1 10,當時想了一會,感覺有點難實現,後來想了幾分鐘,居然實現了,後來再想的時候,突然不回了,怎麼也想不出來了,後來看自己的 ...
無序陣列排序後的最大相鄰差
無序陣列排序後的最大相鄰差 public class maxdis int d max min 1.如果 max和min相等則說明陣列中所有元素都相等則,返回0 if d 0 2.初始化桶 int bucketnum array.length bucket buckets newbucket buc...
實現只有0,1,2三種元素的亂序陣列的排序
第一眼看到這樣的題目,會舉得非常簡單,只需要兩次遍歷陣列就可以完成了。第一次遍歷,掃瞄陣列中的元素,每次遇到0則count0 遇到1則count1 遇到2則count2 這樣一趟下來就能夠統計出陣列中0,1,2的個數了。然後第二次遍歷的時候,只需要對陣列進行重新賦值就可以了,從頭開始賦值count0...