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!
这道题的数据有点弱,之前用一个最差为n^2的算法也是直接就ac了,以为这道题很简单。。
看到hard模式以后知道这道题肯定不能是n^2的算法,于是就没辙了。。。
如下思路,
先找到一个最高的点,然后分别从左右扫描,扫描的过程中记录下扫描到该位置时,已经扫描过的最大值ma,如果当前位置的值小于ma,则sum = sum + ma-A[i],否则更新ma的值。O(n)
class Solution {
public:
int trap(int A[], int n) {
int maxIndex = 0;
for(int i=1;i<n;i++){
if(A[i]>A[maxIndex])
maxIndex = i;
}
int sum = 0;
int ma = 0;
for(int i=0;i<maxIndex;i++){
if(A[i]<ma)
sum+=ma-A[i];
else
ma = max(ma,A[i]);
}
ma = 0;
for(int i=n-1;i>maxIndex;i--){
if(A[i]<ma)
sum+=ma-A[i];
else
ma = max(ma,A[i]);
}
return sum;
}
};