P108 雨后盛水量
算法 24 阅读
信号摘要
难度:Hard · 时长:08:42 · leetcode 42 · lintcode 363
未对外公开播放权限
点击查看说明
描述
这个题目说的是,给你一个非负整数数组表示的高度图,你要计算出下雨后,这个高度图中可以盛多少水。
比如说,给你的数组是:0, 2, 0, 4, 0, 1, 2
高度示意图:
^ | 4 + +--+ | | | 3 + | | | | | 2 + +--+ | | +--+ | | | | | | | 1 + | | | | +--+ | | | | | | | | | +--+--+--+--+--+--+--+--> 0 1 2 3 4 5 6
在这个高度图中,下标 2 位置的盛水量是 2,下标 4 位置的盛水量是 2,下标 5 位置的盛水量是 1,因此总共的盛水量是:
2 + 2 + 1 = 5
代码
public class AlgoCasts {
// Time: O(n), Space: O(n)
public int waterCanBeTrap(int[] height) {
if (height == null || height.length == 0) return 0;
int n = height.length, leftMax = -1, rightMax = -1, water = 0;
int[] d = new int[n];
for (int i = 0; i < n; ++i) {
leftMax = Math.max(leftMax, height[i]);
d[i] = leftMax;
}
for (int i = n-1; i >= 0; --i) {
rightMax = Math.max(rightMax, height[i]);
d[i] = Math.min(d[i], rightMax);
water += (d[i] - height[i]);
}
return water;
}
// Time: O(n), Space: O(1)
public int waterCanBeTrapO1(int[] height) {
if (height == null || height.length == 0) return 0;
int leftMax = -1, rightMax = -1, water = 0;
int i = 0, j = height.length - 1;
while (i <= j) {
leftMax = Math.max(leftMax, height[i]);
rightMax = Math.max(rightMax, height[j]);
if (leftMax < rightMax) water += (leftMax - height[i++]);
else water += (rightMax - height[j--]);
}
return water;
}
}