个人思路总结:
我们可以建立两个vector(left和right),其中left[i]表示height[i]左边最大的高度,right[i]表示height[i]右边最大的高度。
然后对height,从i=1到i=n-2进行遍历,得到height[i]对应的left[i]和right[i]的最小值,然后计算max(0,min(left[i],right[i])-height[i]),这个便是当前height[i]所对应的储水量。
代码如下:
class Solution {
public:
int trap(vector<int>& height) {
int len = height.size();
// left[i]表示i左边的最大值,right[i]表示i右边的最大值
vector<int> left(len),right(len);
for(int i=1;i<len;i++)
{
left[i] = max(left[i-1],height[i-1]);
}
for(int i=len-2;i>=0;i--)
{
right[i] = max(right[i+1],height[i+1]);
}
int water = 0;
//注意,最左边和最右边不用考虑,因为一定为0
for(int i=1;i<len-1;i++)
{
int level = min(left[i],right[i]);
water += max(0,level-height[i]);
}
return water;
}
};