您的位置:首页 > 移动开发

[LeetCode] Trapping Rain Water

2017-09-10 20:44 471 查看
[Problem]
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!

[Analysis]

对于每一木板,

(1)假设其右边的高度无限高,那么这个木板上能够存储水的量依赖于左边最高的木板,例如,4,3,2,6这4块木板,因为假设右边无限高,所以它们依次能够存储水的量是0,1,2,0。

(2)同样,假设其左边的高度无限高,那么木板上能够存储水的量依赖于右边最高的木板,同样以4,3,2,6这4块木板为例,因为假设左边无限高,所以它们依次能够存储水的量是2,3,4,0

(3)最后,对于每一块木板,所能够存储水的量,依赖于上面(1)(2)中较小的,所以上面4块木板实际能够存储水的量是min(0,2),
min(1,3), min(2,4), min(0,0),即0,1,2,0,一共能够存储水的量是0+1+2+0=3

[Solution]
class Solution {
public:
int trap(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function

// empty
if(n <= 0){
return 0;
}

// forward water and backward water
int forward
;
int backward
;
memset(forward, 0, sizeof(forward));
memset(backward, 0, sizeof(backward));

// update forward water
int maxV = A[0];
for(int i = 1; i < n; ++i){
if(A[i] >= maxV){
maxV = A[i];
forward[i] = 0;
}
else{
forward[i] = maxV - A[i];
}
}

// update backward water
maxV = A[n-1];
for(int i = n-2; i >= 0; --i){
if(A[i] >= maxV){
maxV = A[i];
backward[i] = 0;
}
else{
backward[i] = maxV - A[i];
}
}

// get max trapping water
maxV = 0;
for(int i = 0; i < n; ++i){
maxV += min(forward[i], backward[i]);
}

return maxV;
}
};

 说明:版权所有,转载请注明出处。Coder007的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: