题目描述(题目难度,困难)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目求解
积满雨水后的图形,从左右两侧出发到最高的柱子,都是一阶阶上升的阶梯,就像爬楼梯一样。
以示例数组为例感受一下:
下雨前的数组:[0,1,0,2,1,0,1,3,2,1,2,1]
下雨后,积满雨水的数组:[0,1,1,2,2,2,2,3,2,2,2,1]
两数组之差即为所积雨水的量。
参考代码如下:
class Solution {
public int trap(int[] height) {
if(height == null || height.length <= 2) return 0;
// 找到数组中第一个最大值的下标
int imax = 0;
for(int i = 1; i < height.length; ++i){
if(height[i] > height[imax]) imax = i;
}
int rain = 0;
int v = height[0];
// 从左边上楼梯
for(int i = 1; i < imax; ++i){
if(height[i] < v) rain += v-height[i];
else v = height[i];
}
v = height[height.length-1];
// 从右边上楼梯
for(int i = height.length-2; i > imax; --i){
if(height[i] < v) rain += v-height[i];
else v = height[i];
}
return rain;
}
}