错误解法:若height[left]>height[right]
则代表有坑
java
class Solution {
public int trap(int[] height) {
int left = 0;
int area = 0;
while(left<height.length-1){
// 找坑
int right = left+1;
while(right<height.length-1 && height[left]>height[right]){
right++;
}
// 计算第i个坑的面积
int length_i = right-left-1;
// 取小的那边作为高
int height_i = height[left]<height[right]?height[left]:height[right];
int area_i = length_i * height_i; // 忽略里面存在石头
// 删除里面的石头
for(int i=left+1;i<right;i++){
area_i = area_i - height[i];
}
// 加入第i个坑的面积
area = area + area_i;
left = right;
}
return area;
}
}
注意:
- 在
for
循环中,条件为i<num.length
;但在while
循环中,条件为i<num.length-1
错误原因:右边仍满足条件,但没坑

正确解法:预先计算每根柱子的左侧最高柱子(包含该柱子本身)和右侧最高柱子(包含该柱子本身),然后再一次遍历计算每个柱子能接的雨水量。
java
class Solution {
public int trap(int[] height) {
// 计算每个柱子的左边最大值
int[] leftMax = new int[height.length];
leftMax[0] = height[0];
for(int i=1; i<height.length; i++){
leftMax[i] = Math.max(leftMax[i-1], height[i]);
}
// 计算每个柱子的右边最大值
int[] rightMax = new int[height.length];
rightMax[height.length-1] = height[height.length-1];
for(int i=height.length-2; i>=0; i--){
rightMax[i] = Math.max(rightMax[i+1], height[i]);
}
// 计算每个柱子的接水量
int area = 0;
for(int i=0; i<height.length; i++){
area = area + (Math.min(leftMax[i], rightMax[i]) - height[i]);
}
return area;
}
}