QUESTION:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6
EXPLANATION:
思路是:从头开始向尾循环,记录当前最高的maxheight,如果遇到比这个maxheight矮的,那么就可以获取到maxheight-当前的水,如果比maxheight高,那么就可以将maxheight换成新的最大值,但是这样有一个问题,那就是在遇到数组最大值后,后面的数组会多算。那么就可以从两边往中间来进行,这样就能保证最后计算的是最大值。那么就能算出正确的雨水。
1.定义两个指针用来标记index,同时定义两个max来标记左右最大值
2.如果height[left]<height[right]那就说明right的值比较大,那么就需要往right靠
3.同时在往right靠的时候,需要查看当前水柱是不是比最大值小,这样就能计算出储水的值
4.最后当left>right也就是计算到了最后的最大值了,就可以获取到正确的答案
SOLUTION:
class Solution {
public int trap(int[] height) {
if(height == null || height.length<=2) return 0;
int left = 0,right = height.length-1,result = 0,leftHeight = 0,rightHeight = 0;
while (left < right) {
if (height[left] < height[right]) {
if (height[left] >= leftHeight) leftHeight = height[left];
else result += leftHeight - height[left];
left++;
} else {
if (height[right] >= rightHeight) rightHeight = height[right];
else result += rightHeight - height[right];
right--;
}
}
return result;
}
}