首先要在整个数组空缺的地方接雨水,不能考虑整体,而要考虑局部怎么算(类似单调栈问题,一个字符一个字符考虑)
分析
对于i位置,能装多少水,就是这里能装水的最高位置减去此时的高度。能装水的最高位置和它左边的最高高度,右边的最高高度有关,所以可以直接拿两个数组来存这个位置的柱子的左边和右边的最大高度。
双指针
如果使用双指针从两边开始的话,在遍历的过程中就可以算到两边的可以接雨水的值,就可以省去在过程中的空间使用。
class Solution {
public int trap(int[] height) {
if(height.length==0)return 0;
int left=0;
int right=height.length-1;
int res=0;
int leftMax=height[left];
int rightMax=height[right];
while(left<right){
leftMax=Math.max(leftMax,height[left]);
rightMax=Math.max(rightMax,height[right]);
if(leftMax<rightMax){
res+=(leftMax-height[left]);
left++;
}else{
res+=(rightMax-height[right]);
right--;
}
}
return res;
}
}