接雨水
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 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
题解
可以使用两个数组分别存储左边的最高值和右边的最高值,这样,当前位置能存储的雨水就是 左右两边高度的最小值减去当前位置的高度;题目本身不难,想到解法比较不容易
class Solution {
public int trap(int[] height) {
int len = height.length;
int[] leftHeight = new int[len];
int[] rightHeight = new int[len];
leftHeight[0] = height[0];
rightHeight[len - 1] = height[len - 1];
for (int i = 1; i < len; i++) {
leftHeight[i] = Math.max(height[i], leftHeight[i - 1]);
}
for (int i = len - 2; i >= 0; i--) {
rightHeight[i] = Math.max(height[i], rightHeight[i + 1]);
}
int ans = 0;
for (int i = 0; i < len; i++) {
ans += Math.min(leftHeight[i], rightHeight[i]) - height[i];
}
return ans;
}
}
func trap(height []int) int {
var leftheight []int = make([]int, len(height))
var rightheight []int = make([]int, len(height))
leftheight[0] = height[0]
rightheight[len(height) - 1] = height[len(height) - 1]
for i:=1; i < len(height); i++ {
leftheight[i] = max(leftheight[i - 1], height[i])
}
for i:=len(height) - 2; i >= 0; i-- {
rightheight[i] = max(rightheight[i + 1], height[i])
}
ans := 0
for i:=0; i < len(height); i++ {
ans += min(leftheight[i],rightheight[i]) - height[i]
}
return ans
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}