給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。
如果陣列元素個數小於 2,則返回 0。
示例 1:
輸入: [3,6,9,1]
輸出: 3
解釋: 排序後的陣列是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。
示例 2:
輸入: [10]
輸出: 0
解釋: 陣列元素個數小於 2,因此返回 0。
說明:
解題思路:題目給定的要求是時間複雜度和空間複雜度為o(n),顯然用sort排序是不符合要求的,然後,我想的方法是,看能不能用hashmap存下每個數與其他數距離的最小值,然後思路到這兒就斷路了…然後翻閱了一下參考部落格的解法,使用桶排序解題,之前沒解過桶排序的題,因此將解法的思路大致看了一下,然後根據思路寫出了下面的**,本演算法的思路是,利用bucket sort解題,遍歷一次陣列求出最大值mx,最小值mn,然後計算每個桶的容量bucket_size = (mx - mn) / n + 1,n為陣列元素的個數,桶的個數bucket_count = (mx - mn) / bucket_size + 1,然後參考資料中提到將每個值放入對應的桶中之後,題目要求的最大間距對應的兩個元素一定位於不同的桶,並且這個最大間距由前乙個桶的最大值和後乙個桶的最小值的差值決定。至此題目可解,另外再提一下,由於桶的元素可能為空,因此為空的桶要跳過,採取的方法是,維護兩個指標pre,cur,每次cur向前找到乙個非空桶,然後pre對應的桶如果為空的話,則也向後移動找非空的桶,然後做差值,完畢後將cur的位置賦給pre即可,cur繼續向後移動。
class
solution
int bucket_size =
(mx - mn)
/ n +
1, bucket_count =
(mx - mn)
/ bucket_size +1;
vector<
int>
max_bucket
(bucket_count, int_min)
,min_bucket
(bucket_count, int_max)
;for
(int i =
0; i < n;
++i)
int res =
0, cur =
1, pre =0;
while
(cur < bucket_count)
while
(pre < cur && max_bucket[pre]
== int_min)
++pre;
if(pre == cur)
break
; res =
max(res, min_bucket[cur]
- max_bucket[pre]);
pre = cur;
++cur;
}return res;}}
;
桶排序小結:
桶排序的定義是定義一些桶,然後通過對映函式間陣列元素對映到對應桶中,然後對桶中元素做排序,使整個陣列有序。
桶排序是基於基數排序並對其進行改進,對應到此題的解法中,利用的對映函式是,先計算最大最小值確定桶要存的鍵範圍,然後有n個數。盡量選取乙個靠近n的值作為桶的個數,(若鍵存在熱點,即某個區間的值非常密集,則靠的密集的鍵會落到乙個桶中),將每個鍵對映到對應桶後,由於密集的值落在同乙個桶中後,最大間距一定不是在同乙個桶中產生,而是在相同桶中產生,這裡可以詳細參考上一步的題解。
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 ...