Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1]
, return 6
.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
自己写的:Runtime: 20 ms runtime beats 84.40% of java submissions.
public int trap(int[] height) {
int max = 0;
for (int i = 1; i < height.length; i++) {
if (height[i] > height[max]) max = i;
}
//找到最高的柱子max,然后分别计算max左右两边可填充的雨水量
leftHelp(height, max);
rightHelp(height, max);
return result;
}
//找到e左边最高的,然后计算可以填充的雨水量
private void leftHelp(int[] height, int e) {
if (e == 0) return;
int max = 0;
for (int i = 1; i < e; i++) {
if (height[i] > height[max]) max = i;
}
for (int i = max; i < e; i++) {
result += height[max] - height[i];
}
leftHelp(height, max);
}
//找到s右边最高的,然后计算可以填充的雨水量
public void rightHelp(int[] height, int s) {
if (s >= height.length - 1) return;
int max = s + 1;
for (int i = s + 1; i < height.length; i++) {
if (height[i] > height[max]) max = i;
}
for (int i = s + 1; i < max; i++) {
result += height[max] - height[i];
}
rightHelp(height, max);
}
效率更高的,算法更好的:
Runtime: 18 ms runtime beats 99.20% of java submissions.https://segmentfault.com/a/1190000006001981
public int trap3(int[] height) {
if (height.length <= 2) return 0;
int maxHeight = 0, maxIndex = 0;
int result = 0;
//find the max height and its index
for (int i = 0; i < height.length; i++) {
if (height[i] > maxHeight) {
maxHeight = height[i];
maxIndex = i;
}
}
//left part
int maxLeft = height[0];
for (int i = 1; i < maxIndex; i++) {
if (height[i] > maxLeft) {
maxLeft = height[i];
} else {
result += maxLeft - height[i];
}
}
//right part
int maxRight = height[height.length - 1];
for (int i = height.length - 2; i > maxIndex; i--) {
if (height[i] > maxRight) {
maxRight = height[i];
} else {
result += maxRight - height[i];
}
}
return result;
}
更短的代码 https://discuss.leetcode.com/topic/36750/very-easy-java-o-n-solution-with-explaination
public int trap2(int[] height) {
int low = 0, hi = height.length - 1;
int total = 0, level = 0;
while (low < hi) {
if (height[low] > height[hi]) {
level = height[hi] > level ? height[hi] : level;
total += Math.max(level - height[hi], 0);
hi--;
} else {
level = height[low] > level ? height[low] : level;
total += Math.max(level - height[low], 0);
low++;
}
}
return total;
}