很有意思的題目,我一開始的思路受計算柱狀型最大面積那道題的影響,想每次求兩種滿足特定關系的柱子之間的水的量,結果各種錯,各種特殊情況需要排除,我意識到是自己的思路有問題了。
停下來想一下水的體積到底跟什麼有關系?當然可以把是水的地方都加起來,這樣必須看兩個柱子之間的高低關系,還要考慮底部的高度。還有一種方法呢,求整個區域的面積,然後把不是水的地方去掉,剩下的就是水的體積。這種方法好在那裡呢?這種方法所需要的信息都很容易獲得,總的面積怎麼求呢?一左一右兩個指針,然後維護一個當前最底部的高度,如果這兩個指針中最小的那個都比最底部的高度高,那麼整個圖形的總的面積應該加上他們之間超出最底部的那部分。升高最底部的那個變量為兩個柱子中較矮的那個,下一輪循環,移動較矮的那個柱子,直到兩個指針相遇為止。如果出現其中一個或兩個指針位於最底部下面怎麼辦呢,那說明他肯定被淹沒到整個圖形的面積中了,直接更新指針進行下一輪。至於該去掉的部分,其實就是多有的柱子,這個值在什麼時候計算都可以。
class Solution { public: int trap(int A[], int n) { if(n < 2) return 0; int l=0, r=n-1, curlevel=0, all=0, block=0; while(l<=r){ if(min(A[l], A[r])>curlevel){ all += (min(A[l], A[r])-curlevel)*(r-l+1); curlevel = min(A[l], A[r]); } if(A[l]