漫畫算法:無序數組排序後的最大相鄰差值










小灰一邊回憶一邊講述起當時面試的情景......程序員









題目:有一個無序整型數組,如何求出這個數組排序後的任意兩個相鄰元素的最大差值?要求時間和空間複雜度儘量低。(例如:無序數組 2,3,1,4,6,排序後是1,2,3,4,6,最大差值是6-4=2)面試







解法一:算法


用一種較快的穩定排序算法(好比歸併算法,時間複雜度N*logN)給原數組排序,而後遍歷排好序的數組,每兩個相鄰元素求差,最終獲得最大差值。數組


該解法的時間複雜度是O(N*logN),在不改變原數組的狀況下,空間複雜度是O(N)。3d

















解法二:cdn


1.利用計數排序的思想,先求出原數組的最大值Max與最小值Min的區間長度k(k=Max-Min+1)。blog


2.建立一個長度爲k的新數組Array。排序


3.遍歷原數組,把原數組每個元素插入到新數組Array對應的位置,好比元素的值爲n,則插入到Array[n-min]當中。此時Array的部分位置爲空,部分位置填充了數值。it


4.遍歷新數組Array,統計出Array中最大連續出現空值的次數+1,即爲相鄰元素最大差值。io


例如給定無序數組 { 2, 6, 3, 4, 5, 10, 9 },處理過程以下圖:






該解法的時間複雜度爲O(n+k),空間複雜度一樣是O(n+k)。











解法三:


1.利用桶排序的思想,先求出原數組從最小值Min到最大值Max的單位區間長度d,d=(Max-Min)/n。算出d的做用是爲了後續肯定各個桶的區間範圍劃分。


2.建立一個長度是N+1的數組Array,數組的每個元素都是一個List,表明一個桶。


3.遍歷原數組,把原數組每個元素插入到新數組Array對應的桶當中,進入各個桶的條件是根據不一樣的數值區間(數值區間如何劃分,看後面的圖就明白了)。因爲桶的總數量是N+1,因此至少有一個桶是空的。


4.遍歷新數組Array,計算每個空桶右端非空桶中的最小值,與空桶左端非空桶的最大值的差,數值最大的差即爲原數組排序後的相鄰最大差值。


例如給定無序數組 { 0, 6, 3, 16, 7, 10, 9, 11, 20, 18 },處理過程以下圖:





該解法的時間複雜度爲O(n),空間複雜度一樣是O(n)。





十分鐘後......





以上就是小灰面試的狀況......









—————END—————




喜歡本文的朋友們,歡迎長按下圖關注訂閱號程序員小灰,收看更多精彩內容

相關文章
相關標籤/搜索