题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例
示例1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例2:
输入:height = [4,2,0,3,2,5]
输出:9
思路
初始化:
- 左右指针分别指向数组首尾,pre和suf初始为0,用于记录左右最大高度,ans记录总储水量。
循环处理:
- 更新当前左指针位置的左侧最大值pre。
- 更新当前右指针位置的右侧最大值suf。
- 若suf较大,处理左指针位置的储水量(由pre决定),左指针右移。
- 反之,处理右指针位置的储水量(由suf决定),右指针左移。
- 终止条件:当左右指针相遇时结束循环,返回总储水量。
代码
class Solution {
public int trap(int[] height) {
int left = 0;
int right = height.length-1;
int ans = 0;
int pre = 0;
int suf = 0;
while (right > left){
pre = Math.max(height[left],pre);
suf = Math.max(height[right],suf);
if (suf > pre){
ans += pre - height[left];
left++;
}
else {
ans += suf-height[right];
right--;
}
}
return ans;
}
}