给定 n
个非负整数表示每个宽度为 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
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
解题思路
1、每个位置能存储多少雨水,取决于他左边和右边的的最大值的最小值和该位置的高度差
2、用两个数组leftMax和rightMax来存左边和右边的最大值。
Java代码
class Solution{
public int trap(int[] height) {
// 初始化leftMax和rightMax
// leftMax[i] 意为该位置左边(不包含该位置)的最大值
// rightMax[i] 意为该位置右边 (不包含该位置)的最大值
int[] leftMax = new int[height.length];
int[] rightMax =new int[height.length];
// 将leftMax数组填好
for(int i=1; i<leftMax.length; i++){
leftMax[i] = Math.max(leftMax[i-1], height[i-1]);
}
// 将rightMax位置填好
for(int i=rightMax.length-2; i>=0; i--){
rightMax[i] = Math.max(rightMax[i+1], height[i+1]);
}
int res = 0;
// 每个位置上面能存储的雨水,等于左边右边最大值中的较小值-该位置的高度
for(int i=1; i<height.length-1; i++){
res += Math.max(0, Math.min(leftMax[i], rightMax[i]) - height[i]);
}
return res;
}
}
Python代码
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
# 初始化leftMax和rightMax
# leftMax[i] 意为该位置左边(不包含该位置)的最大值
# rightMax[i] 意为该位置右边 (不包含该位置)的最大值
leftMax = [0 for _ in range(len(height))]
rightMax = [0 for _ in range(len(height))]
# 将leftMax数组填好
for i in range(1, len(leftMax)):
leftMax[i] = max(leftMax[i-1], height[i-1])
# 将rightMax位置填好
for i in range(len(rightMax) - 2, -1, -1):
rightMax[i] = max(rightMax[i+1], height[i+1])
res = 0
# 每个位置上面能存储的雨水,等于左边右边最大值中的较小值-该位置的高度
for i in range(1, len(rightMax)-1):
res += max(0, min(leftMax[i], rightMax[i]) - height[i])
return res