题目描述:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
算法思想:参考https://blog.csdn.net/i000zheng/article/details/79725417
使用两根指针:
1. 一根从右往左,更新记录从位置i往右边的峰值;
2. 一根从左往右遍历。更新从位置i往左边峰值的同时,计算位置i处可以积水多少;
3. 水面高度h应为min(maxL,maxR)。积水应为max(0,h-height[I]);
class Solution {
public int trap(int[] height) {
if(height == null || height.length <= 2)
return 0;
int maxL = height[0];
int[] maxRs = new int[height.length];
int waterSum = 0;//计算总的水量
int maxR = 0;
for(int i = height.length - 1; i >= 0; i--){
if(height[i] > maxR) {
maxRs[i] = maxR = height[i];
}
else {
maxRs[i] = maxR;
}
}
for(int i = 1; i < height.length - 1; i++){
if(height[i] > maxL) {
maxL = height[i];//更新左边最大值
}
waterSum += Math.max(Math.min(maxL, maxRs[i]) - height[i], 0);
}
return waterSum;
}
}