1. 程式人生 > >九章演算法面試題45 尋找最大的儲水容器

九章演算法面試題45 尋找最大的儲水容器

九章演算法官網-原文網址


題目

給定一個正整數陣列(a0,a1..),分別代表n個座標(0,a0), (1,a1),根據這n個點畫出n條線段,每條線段的兩個端點分別為(i, ai)和(i, 0)。找到兩條線段,使得這兩條線段和x軸所構成的容器儲水容量最大。如[2,1,3], 最大,選擇第一條線段和第三條線段,加上x軸所構成的容器,儲水容量為4(高度為Min(2,3)=2,底為2)


解答

用兩根指標,一根指向頭,一根指向尾,如果A[head] > A[tail],意味著以tail為容器右邊的最大容器面積為A[tail] * (tail - head),記錄下這個值,然後扔掉tail這條線段。同理如果A[head] < A[tail]我們可以記錄下A[head] * (tail - head),然後扔掉head。重複上述演算法知道head與tail相遇。在過程中記錄下來的面積中的最大值即為問題所求。時間複雜度O(n),空間O(1)


面試官角度

在九章第42題和43題中,我們提到了使用棧來輔助計算每個數往左數or往有數比他大or小的“第一個”數。在該問題中我們不難分析出,我們需要尋找的是每個數往左數or往右數比他大的“最後一個”數。那麼這和我們之前用棧的使用場景不符合。因此需要尋找其他的解決方案。兩根指標的問題,是在陣列面試題中用得比較多的思想。在今後的題目中,我們也會陸續介紹運用了類似思路的題目。