算法-接雨水

描述

定 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

方案

1. 动态规划

对于下标 i,下雨后水能到达的最大高度等于下标 i 两边的最大高度的最小值,下标 i 处能接的雨水量等于下标 i 处的水能到达的最大高度减去 height[i]。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public int trap(int[] h) {
if (h == null || h.length == 0) {
return 0;
}
int len = h.length;
int[] lMax = new int[len];
int[] rMax = new int[len];
lMax[0] = h[0];
rMax[len - 1] = h[len - 1];
for (int i = 1; i < len; i++) {
lMax[i] = Math.max(lMax[i - 1], h[i]);
}
for (int i = len - 2; i >= 0; i--) {
rMax[i] = Math.max(rMax[i + 1], h[i]);
}
int total = 0;
for (int i = 0; i < len; i++) {
total += (Math.min(lMax[i], rMax[i]) - h[i]);
}
return total;
}
}

算法-接雨水
http://example.com/2023/03/16/算法-接雨水/
作者
BiggerBrain
发布于
2023年3月16日
许可协议