Volume of Histogram:直方图中每一列的宽度为1
,计算直方图的盛水量。
最高的一列将直方图分成了两部分,因此可以分别计算左右两部分的盛水量再求和,这样就将直方图分成了两部分,同时这一列变成了左边一部分的右边界,而左边最高的一列又将左边分成了两个小部分,靠右部分的盛水量由这一列和刚才确定的右边界决定,而靠左部分的盛水量由这一列作为右边界递归确定。
不过上面的解法太复杂了。从题目中给的图来看,每一块的盛水量是由左边最高的和右边最高的这二者中较矮的决定的。
class Solution {
public:
int trap(vector<int>& height) {
vector<size_t> LeftMax(height.size());
vector<size_t> RightMax(height.size());
size_t max = 0;
for(size_t i = 0; i < height.size(); i++)
{
if(max < height[i]) max = height[i];
LeftMax[i] = (max);
}
max = 0;
for(size_t i = height.size(); i > 0; i--)
{
if(max < height[i - 1]) max = height[i - 1];
RightMax[i - 1] = max;
}
int sum = 0;
for(size_t i = 0; i < LeftMax.size(); i++)
{
sum += min(LeftMax[i], RightMax[i]) - height[i];
}
return sum;
}
};