动态规划:
我们可以观察到接雨水的关键在于找到每个柱子上方的左边最高柱子和右边最高柱子
public int trap(int[] height) {
int n = height.length;
int[] left = new int[n]; // 存储每个柱子左侧的最大高度的数组
int[] right = new int[n]; // 存储每个柱子右侧的最大高度的数组
// 计算每个柱子左侧的最大高度
for (int i = 1; i < n; i++) {
left[i] = Math.max(left[i - 1], height[i - 1]);
}
// 计算每个柱子右侧的最大高度
for (int i = n - 2; i >= 0; i--) {
right[i] = Math.max(right[i + 1], height[i + 1]);
}
int sum = 0; // 存储被积水的总量
// 计算每个柱子上方可以积水的量
for (int i = 1; i < n - 1; i++) {
int water = Math.min(left[i], right[i]) - height[i]; // 计算当前柱子上方的水的高度
if (water > 0) {
sum += water; // 将积水的量累加到总量中
}
}
return sum;
}