Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
JAVA
方法一
从左向右扫描一次,每次只找右侧大于等于当前高度的值,这样两者之间才能存下水。算出两者间能够存下水的最大容量,再减去中间有高度的部分。再从右向左扫描一次,每次只招大于当前高度的值。注意左右两次扫描时,不能都包括等于当前高度的值,否则这个值会被重复计算两次。
效率在前10%。
public class Solution {
public int trap(int[] height) {
if(height.length < 3){
return 0;
}
int result = 0;
int lowIndex = 0;
int mound = 0;
for(int i = 1; i < height.length; ++i){
if(height[i] >= height[lowIndex]){
result = result + height[lowIndex] * (i - lowIndex - 1) - mound;
lowIndex = i;
mound = 0;
}else{
mound += height[i];
}
}
lowIndex = height.length - 1;
mound = 0;
for(int i = height.length - 2; i >= 0; --i){
if(height[i] > height[lowIndex]){
result = result + height[lowIndex] * (lowIndex - i - 1) - mound;
lowIndex = i;
mound = 0;
}else{
mound += height[i];
}
}
return result;
}
}