42.接雨水
困难
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
先找到最长的柱子,并且总是将左/右的柱子视为短板,两边逐步向最长柱子靠拢。
解题:
class Solution {
public:
int trap(vector<int>& height) {
int ans = 0;
int maxHeight = 0, maxLoc = 0;
int heightSize = height.size();
int left = 0, right = heightSize - 1;
int leftHeight = 0, rightHeight = 0;
//如果容器大小小于等于2则无法装水,直接退出
if (heightSize <= 1)return 0;
//找到最右边的最大高度并记录其值和位置
for (int i = 0; i < heightSize; ++i)
{
if (height[i] >= maxHeight)
{
maxHeight = height[i];
maxLoc = i;
}
}
//从左往右,直到抵达最大高度maxLoc位置
while (left < maxLoc)
{
if (leftHeight >= height[left])
{
ans += leftHeight - height[left];
}
else
{
leftHeight = height[left];
}
++left;
}
//从右往左
while (right > maxLoc)
{
if (rightHeight >= height[right])
{
ans += rightHeight - height[right];
}
else
{
rightHeight = height[right];
}
--right;
}
return ans;
}
};