leetcode:Trapping Rain Water
2014-01-26 01:43
441 查看
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!
分析
对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是min(max_left,
max_right) - height。所以,
1. 从左往右扫描一遍,对于每个柱子,求取左边最大值;
2. 从右往左扫描一遍,对于每个柱子,求最大右值;
3. 再扫描一遍,把每个柱子的面积并累加。
也可以,
1. 扫描一遍,找到最高的柱子,这个柱子将数组分为两半;
2. 处理左边一半;
3. 处理右边一半。
代码:
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!
分析
对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是min(max_left,
max_right) - height。所以,
1. 从左往右扫描一遍,对于每个柱子,求取左边最大值;
2. 从右往左扫描一遍,对于每个柱子,求最大右值;
3. 再扫描一遍,把每个柱子的面积并累加。
也可以,
1. 扫描一遍,找到最高的柱子,这个柱子将数组分为两半;
2. 处理左边一半;
3. 处理右边一半。
代码:
class Solution { public: int trap(int A[], int n) { if (n==0) { return 0; } n=n-1; int maxNumber=FindMax(A,0,n); int l=leftSolution(A,maxNumber); int r=rightSolution(A,maxNumber,n); return l+r; } public: int rightSolution(int A[],int r,int n) { if (r==n) { return 0; } int maxNumber=FindMax(A,r+1,n); int sumNumber=0; for (int i = maxNumber-1; i >=r+1; i--) { sumNumber+=A[i]; } int sum=A[maxNumber]*(maxNumber-r-1)-sumNumber; return rightSolution(A,maxNumber,n)+sum; } public: int leftSolution(int A[],int l) { if (l==0) { return 0; } int maxNumber=FindMax(A,0,l-1); int sumNumber=0; for (int i = maxNumber+1; i <=l-1; i++) { sumNumber+=A[i]; } int sum=A[maxNumber]*(l-maxNumber-1)-sumNumber; return leftSolution(A,maxNumber)+sum; } public: int FindMax(int A[],int l,int h) { int maxNum=l; for (int i = l; i < h+1; i++) { if (A[maxNum]<A[i]) { maxNum=i; } } return maxNum; } };
相关文章推荐
- leetcode编程记录17 #42 Trapping Rain Water
- LEETCODE: Trapping Rain Water
- LeetCode Trapping Rain Water
- leetcode-042:Trapping Rain Water
- Leetcode:Trapping Rain Water
- leetcode---trapping-rain-water
- LeetCode——Trapping Rain Water
- LeetCode:Container With Most Water,Trapping Rain Water
- leetcode Trapping Rain Water
- leetcode:Trapping Rain Water
- LeetCode题解——Trapping Rain Water
- [LeetCode][Java] Trapping Rain Water
- Leetcode_trapping-rain-water(updated c++ and python version)
- [LeetCode] Trapping Rain Water 收集雨水
- [LeetCode]Trapping Rain Water(!!!!)
- [LeetCode] Trapping Rain Water 栈
- [LeetCode] Trapping Rain Water
- LeetCode Trapping Rain Water
- Leetcode: Trapping Rain Water
- [Leetcode]Trapping Rain Water - 递减栈