11. 盛最多水的容器 - 力扣(LeetCode)
题目描述
给定 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 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5] 输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
题解
思路:对于每一列的柱子,所能容纳的雨水是其左侧最大高度和右侧最大高度的最小值与本身高度的差值,即min{左侧最大高度的柱子,右侧最大高度的柱子}-自身高度
因此,我们需要计算每一列柱子的左侧最大高度的柱子,与右侧最大高度的柱子。
故使用另个数组lh和rh对height进行一次遍历,并分别保存每一列左右两侧最大高度柱子的值
class Solution {
public:
int trap(vector<int>& height) {
if(height.size()<=2) return 0;
vector<int> lh(height.size(),0);
vector<int> rh(height.size(),0);
lh[0]=height[0];
for(int i=1;i<height.size();i++)
{
lh[i]=max(height[i],lh[i-1]);
}
rh[height.size()-1]=height[height.size()-1];
for(int i=height.size()-2;i>=0;i--)
{
rh[i]=max(height[i],rh[i+1]);
}
int sum=0;
//由于两端的柱子不能接雨水,因此i的取值为[1,height.size()-2]
for(int i=1;i<height.size()-1;i++)
{
sum+=(min(lh[i],rh[i]))-height[i];
}
return sum;
}
};