问题:
解题:
分析:多种思路吧,我的一定想法是判断波峰,然后获得波峰之间的水,但是需要考虑波峰之间的关系,比如中间都是小波峰,边缘都是大波峰,就比较尴尬;还有一种比较好理解的就是两个方向都计算一下,然后取双方重叠的部分如下图
思来想去,还是想继续让判断波峰的程序可以使用,就是得判断边界是不是向内部递减的,这样边界也要算到波峰中,去掉中间的波峰就得判断中间部分的波峰是不是比两次的波峰小,这样的话,为什么不直接从两侧开始判断呢,就找到了双指针的方法,两侧都获取到两侧的最大值,要是当前值比较小,就计算一下跟当前侧最大值的差,进行累加,当前是波峰无所谓,就是0,要是比最大值小,那肯定可以有水,毕竟两侧同事开始判断,并不会重复,还可以剔除掉中间比较小的波峰值,直接过滤了
class Solution {
public int trap(int[] height) {
// 需要找到波峰波谷
if (null == height || height.length < 3) {
// 小于3没有波峰波谷
return 0;
}
// 找到波峰,波谷 key index value 峰值
// 去掉中间低位的峰值 双指针
int leftIndex = 0,
rightIndex = height.length - 1,
maxLeft = 0,
maxRight = 0,
count = 0;
while (rightIndex > leftIndex) {
// 获取左右的最大值
maxLeft = Math.max(maxLeft, height[leftIndex]);
maxRight = Math.max(maxRight, height[rightIndex]);
if (height[leftIndex] < height[rightIndex]) {
// 如果左边当前值比较小,先计算左边的雨水
count += maxLeft - height[leftIndex];
// 当前位置计算完成,下一个
leftIndex++;
} else {
// 如果右边边当前值比较小,先计算左边的雨水
count += maxRight - height[rightIndex];
// 当前位置计算完成,下一个
rightIndex--;
}
}
return count;
}
}
性能:
运算简单,操作都是数字,速度比较快