问题
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.
样例
如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.
思路
思路是先看最底下一层能接多少雨水,然后再依次推断到第二层,第三层......最高层。
实现
public static int trapRainWater(int[] heights) {
// write your code here
// 先找到最大值
int max = 0;
for (int i=0;i<heights.length;i++) {
max = Math.max(max, heights[i]);
}
int rains = 0;
// 思路是先看最底下一层能接多少雨水,然后再依次推断到最高层
for (int floor = 0; floor < max; floor++) {
// 当层数为floor层时
// 从第1位到第一个非0位之间的0都置为1(便于统计这一层的雨水)
for (int i=0;i<=heights.length-1;i++) {//统一使用0-start
if (heights[i] == 0) {
heights[i] = 1;
} else {
break;
}
}
// 从最后1位到倒数第一个非0位之间的0都置为1(便于统计这一层的雨水)
for (int i=heights.length-1;i>=0;i--) {//统一使用0-start
if (heights[i] == 0) {
heights[i] = 1;
} else {
break;
}
}
for (int i=0;i<heights.length;i++) {
if (heights[i] == 0) {
//经过前面的准备工作,我们可以很轻松的分辨出来哪些是雨水
rains++;
} else {
//这里要做个操作,就是把数组里的所有元素都减1,为了上面一层的计算做准备
heights[i]--;
}
}
}
return rains;
}
如果您觉得文章对你有帮助的话,不要忘了打赏小编哦