小灰一邊回憶一邊講述起當時面試的情景......
題目:有一個無序整型陣列,如何求出這個陣列排序後的任意兩個相鄰元素的最大差值?要求時間和空間複雜度儘可能低。(例如:無序陣列 2,3,1,4,6,排序後是1,2,3,4,6,最大差值是6-4=2)
解法一:
用一種較快的穩定排序演算法(比如歸併演算法,時間複雜度N*logN)給原陣列排序,然後遍歷排好序的陣列,每兩個相鄰元素求差,最終得到最大差值。
該解法的時間複雜度是O(N*logN),在不改變原陣列的情況下,空間複雜度是O(N)。
解法二:
1.利用計數排序的思想,先求出原陣列的最大值Max與最小值Min的區間長度k(k=Max-Min+1)。
2.建立一個長度為k的新陣列Array。
3.遍歷原陣列,把原陣列每一個元素插入到新陣列Array對應的位置,比如元素的值為n,則插入到Array[n-min]當中。此時Array的部分位置為空,部分位置填充了數值。
4.遍歷新陣列Array,統計出Array中最大連續出現空值的次數+1,即為相鄰元素最大差值。
例如給定無序陣列 { 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—————
喜歡本文的朋友們,歡迎長按下圖關注訂閱號程式設計師小灰,收看更多精彩內容