输入: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 个单位的雨水(蓝色部分表示雨水)。
思路:这道题我们只需要从每个i去考虑,考虑每个i位置能接到多少雨水,把每个i位置接到的雨水相加,就得到了总共能接到的雨水。
那么每个i位置到底能接到多少雨水呢?
仔细观察我们可以发现i位置能接多少雨水是由Math.min(leftMax,rightMax)决定的
用通俗的话讲就是左边的最大和右边的最大取一个最小值,再减去我当前的i的高度,就得到了目前i位置能接到的雨水
//考虑每个位置能装的水,取决于Math.min(leftMax,rightMax)
class Solution {
public int trap(int[] height) {
int N = height.length;
int L = 1,R=N-2;
int leftMax = height[0],rightMax = height[N-1];
int water = 0;
while(L<=R){
//左边是真实的Max,右边的Max也只会比当前大
if(leftMax<=rightMax){
water +=Math.max(0,leftMax-height[L]);
leftMax = Math.max(leftMax,height[L++]);
//右边是真实的Max,左边的Max也只会比当前大
}else{
water += Math.max(0,rightMax-height[R]);
rightMax = Math.max(rightMax,height[R--]);
}
}
return water;
}
}