class Solution {
public int trap(int[] height) {
if(height.length < 3 || height == null) return 0;
int left = 0;
int right = height.length - 1;
int leftmax = 0;
int rightmax = 0;
int rain = 0;
while(left < right){
//找出每个元素最左边的最大值和最右边的最大值
leftmax = Math.max(height[left], leftmax);//左边最大值和自身比较
rightmax = Math.max(height[right], rightmax);
if(leftmax > rightmax){
rain += rightmax - height[right];
right--;//当rightmax < leftmax的值时,left++的水位是确定的,不管left和right中间是高是低
}
else{
rain += leftmax - height[left];//如果自身是左边最大值,相减得0,如果自身不是,那么左边最大值不变
left++;//当leftmax < rightmax的值时,left++的水位是确定的,不管left和right中间是高是低,但是right--的水位是不确定的
}
}
return rain;
}
}
归纳:
双指针从两边往中间移动,当leftmax < rightmax的值时,left++的水位是确定的,不管left和right中间是高是低,但是right–的水位是不确定的,受到中间值的影响