仔细想想,这道题可以从横坐标每格考虑。横坐标每格可能积攒的雨水量由这格左右最高高度的最小值和该格高度的差决定。无论整体结构如何,只要该格左右最高高度确定,那么该格能够积攒多少雨水就确定了。我们统计求和每一格即可得到最后结果。 思路就是先记录每格的左侧最高和右侧最高高度。在根据这两个数据和自身高度计算即可。
class Solution {
public:
int trap(int A[], int n) {
int res = 0;
int h = A[0];
vector<int> left(n);
vector<int> right(n);
for( int i=0;i<n;i++ )
{
left[i] = h;
if( A[i] > h )
{
h = A[i];
}
}
h = A[n-1];
for( int i=n-1;i>=0;i-- )
{
right[i] = h;
if( A[i] > h )
{
h = A[i];
}
}
for( int i=0;i<n;i++ )
{
int tmp = min(left[i],right[i])-A[i];
if( tmp > 0 )
{
res += tmp;
}
}
return res;
}
};