[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
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的博客
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的博客
相关文章推荐
- 【Leetcode】之Trapping Rain Water
- [*leetcode 42] Trapping Rain Water
- LeetCode Trapping Rain Water
- Leetcode: Trapping Rain Water
- [LeetCode]Trapping Rain Water
- [LeetCode]407. Trapping Rain Water II
- [leetcode刷题系列]Trapping Rain Water
- [LeetCode][JavaScript]Trapping Rain Water
- [leetcode-42]Trapping Rain Water(java)
- LeetCode 42 Trapping Rain Water
- LeetCode | Trapping Rain Water(柱子间存储的水容量)
- LeetCode 042 Trapping Rain Water
- leetcode---trapping-rain-water
- LeetCode(42)Trapping Rain Water
- LeetCode(42) Trapping Rain Water
- Trapping Rain Water--LeetCode
- [Leetcode] #42 Trapping Rain Water
- LeetCode 41 Trapping Rain Water
- leetcode Trapping Rain Water
- Leetcode之Trapping Rain Water