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 个单位的雨水(蓝色部分表示雨水)。示例 2:
输入:height = [4,2,0,3,2,5] 输出:9
双指针法(优先掌握)
在暴力解法中,我们可以看到只要记录左边柱子的最高高度 和 右边柱子的最高高度,就可以计算当前位置的雨水面积,这就是通过列来计算。
当前列雨水面积:min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度。
当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值。
即从左向右遍历:maxLeft[i] = max(height[i], maxLeft[i - 1]);
从右向左遍历:maxRight[i] = max(height[i], maxRight[i + 1]);
class Solution {
public:
//双指针法
int trap(vector<int>& height) {
if(height.size()<=2)return 0;
vector<int>maxleft(height.size(),0);
vector<int>maxright(height.size(),0);
int size=height.size();
//记录每个柱子左边柱子的最大值
maxleft[0]=height[0];
for(int i=1;i<size;i++)
{
maxleft[i]=max(height[i],maxleft[i-1]);
}
//记录每个柱子右边柱子的最大值
maxright[size-1]=heig