- 接雨水
题目:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
- 解法1:记忆化搜索?动态规划
class Solution {
public int trap(int[] height) {
if (height == null || height.length < 3) return 0;
int len = height.length;
int[] l_max = new int[len];
int[] r_max = new int[len];
int res = 0;
for (int i = 1; i < len; i++) {
l_max[i] = Math.max(l_max[i - 1], height[i - 1]);
}
for (int i = len - 2; i >= 0; i--) {
r_max[i] = Math.max(r_max[i + 1], height[i + 1]);
}
for (int i = 1; i < len - 1; i++) {
int min = Math.min(l_max[i], r_max[i]);
if (min > height[i]) res += min - height[i];
}
return res;
}
}
- 解法二 双指针
class Solution {
public int trap(int[] height) {
if (height == null || height.length < 3) return 0;
int len = height.length;
int left = 0;
int right = len - 1;
int l_max = height[0];
int r_max = height[len - 1];
int res = 0;
while (left <= right) {
l_max = Math.max(l_max, height[left]);
r_max = Math.max(r_max, height[right]);
if (height[left] < height[right]) {
res += l_max - height[left];
left++;
} else {
res += r_max - height[right];
right--;
}
}
return res;
}
}