42.接雨水
这是一个简单的动态规划问题,虽然leetcode将它归结为困难。
但是我感觉它难度应该达不到,可能归结为中等比较合适
0x1 题目
给定 n
个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
- 题目地址:https://leetcode.cn/problems/trapping-rain-water/description/
0x2 示例
//如上图
输入: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 个单位的雨水(蓝色部分表示雨水)。
输入:height = [4,2,0,3,2,5]
输出:9
0x3 解题思路
对于这道题目,雨水的体积等于每一列,雨水能达到的最大高度-柱子高度的累加。
那么接下来我们的重心就是如何求取这个最大高度。除去两边的临界条件,其他中间所有的柱子,我们只需要向两边看,两边看到的最小高度就是我们所能达到的最大高度。以中间某个柱子为例。
代码
public int trap(int[] height) {int n = height.length;if(n==0){return 0;}int[] leftMax = new int[n];leftMax[0] = height[0];for(int i = 1; i < n; i++){leftMax[i] = Math.max(leftMax[i-1],height[i]);}int[] rightMax = new int[n];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;
}