思路:
从当前位置pos的柱子开始,搜索后面的柱子A[k],k = pos+1,...,n,A[k]有两种情况:
1)A[k] >= A[pos],且k - pos > 1,此时组成一个“桶”,注意:此时他们的桶底是中间(pos 到 k中间)高度最高的柱子,桶底与这根柱子顶部平行,在这种情况下,就不用往后搜索了,因为A[k]阻止了A[pos]与后面的柱子形成通;
2) A[k] < A[pos],只要 k - pos >1,而且中间位置(pos 到 k)的最高的柱子不超过A[k],也能形成一个桶,当然这个情况下,还是向后搜索,因为此时A[k]不能阻止A[pos]与后面的柱子形成“桶”。
注意中间位置的高度的记录,每次保留已经搜索的最大值。
整个时间复杂度为O(n^2)。这个题有O(n)个解法,以后再来^_^.
code:
class Solution { public: int trap(int A[], int n) { if(n<=1)return 0; int sum = 0, midHeigh; for(int i=0;i<n;i++){ midHeigh = 0; for(int j=i+1;j<n;j++){ if(A[j] >= A[i]){ //第一种形成“桶”情况 sum += ((A[i] - midHeigh)*(j-1-i)); break; } else{ //第二种形成“桶”情况 if(A[j] > 0 && midHeigh < A[j]) sum += (A[j] - midHeigh)*(j-1-i); midHeigh = max(midHeigh,A[j]); //更新中间位置的柱子的最高高度 } } } return sum; } };