描述
分析
i位置能积累的雨水量,等于其左右两边最大高度的最小值。
为了能获取i位置左右两边的最大高度。使用动态规划。
两个dp数组:
- leftMax
- rightMax
其中
- leftMax[i] 代表i位置左边的最大高度
- rightMax[i] 代表i位置右边的最大高度
初始状态:
- leftMax[0] = 0;
- rightMax[0] =0;
填充这两个dp数组。
那么i位置最终能存的雨水量为:min(eftMax[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];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]);}int res = 0;for (int i = 0; i < n; i++) {res += Math.min(leftMax[i], rightMax[i]) - height[i];}return res;}
}