1. 程式人生 > >九章演算法面試題80 接雨水

九章演算法面試題80 接雨水

原文網址:

問題詳情 

給出 n 個非負整數,代表一張X軸上每個區域寬度為 1 的海拔圖, 計算這個海拔圖最多能接住多少(面積)雨水

線上評測本題:

http://www.lintcode.com/zh-cn/problem/trapping-rain-water/


解答 

這道題可以有兩種做法。

做法一:掃兩遍。 對某個值A[i]來說,能trapped的最多的water取決於在i之前左邊的最高值和在i右邊的最高的值,然後取當中較小的一個。 所以可以根據上面的分析先從左到右掃一遍得到陣列LeftMostHeight,然後再從右到左計算RightMostHeight,這樣只掃了兩遍可以得到答案,時間複雜度是O(n),空間複雜度是O(n)。

做法二:兩個指標掃一遍, 這道題其實是一道兩個指標的題目,而且指標屬性是對撞型指標。 所以用兩個指標分別指向陣列的頭和陣列尾。 然後每次比較兩個指標所指向的值,選小值指標向中間移動,並且每次更新遍歷LeftMostHeight或者RightMostHeight, 這樣就可以算出每個點的可以接的雨水數目。 這種方法的時間複雜度是O(n)。空間複雜度是O(1)。


參考程式碼

http://www.jiuzhang.com/solutions/trapping-rain-water/