- 题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
- 示例
输入:height = [4,2,0,3,2,5]
输出:9
- 算法
- leftMax[i]表示从0号柱子到i号柱子中的最高柱子高度
rightMax[i]表示从n-1号柱子到i号柱子中的最高柱子高度- 从0号柱子到i号柱子中的最高柱子要么是i号柱子要么是从0号柱子到i-1号柱子中的最高柱子
即leftMax[i] = Math.max(leftMax[i-1], height[i]);- 0到n-1号柱子中可以储水的是1到n-2号柱子
第i(1 <= i <= n-1)号柱子的储水量为宽度(默认为1)* min(左边最高, 右边最高)
即 res += Math.min(leftMax[i], rightMax[i]) - height[i];
- 代码
class Solution {
public int trap(int[] height) {
int n = height.length;
int[] leftMax = new int[n];
int[] rightMax = new int[n];
int res = 0;
leftMax[0] = height[0];
for (int i = 1; i < n; i++) {
leftMax[i] = Math.max(leftMax[i-1], height[i]);
}
rightMax[n-1] = height[n-1];
for (int i = n - 2; i >= 0; i--) {
rightMax[i] = Math.max(rightMax[i+1], height[i]);
}
for (int i = 1; i < n - 1; i++) {
res += Math.min(leftMax[i], rightMax[i]) - height[i];
}
return res;
}
}