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], return6.
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!
解题思路:
类似于前述最大矩形解法,前为切头,此为填坑,异曲同工;
同理,可改为stack,复杂度为O(n): 将计算过的部分弹栈,认为其高度等于当前新水坝高度。
复杂度为O(n^2);
class Solution {
public:
int minn( int a, int b){
if( a < b){
return a;
}
return b;
}
int trap(int A[], int n) {
//记录左侧水坝最大高度
//每次加入新水坝,判断是否满足蓄水条件(水坝高度是否大于前一个水坝)
//更新储水量,并填坑。
//更新储水量:直至找到左侧最大高度的水坝或和当前水坝一样高的水坝
//填坑:为防止重复计算,将计算过的地方填平。
int sum = 0;
int maxLeft = A[0];
for(int i= 1 ; i< n ; i++ ){
//满足蓄水条件
if( A[i] > A[i-1] ){
int cur = minn(maxLeft,A[i]);
int cnt = 0;
int k = i-1;
while( A[k] < cur ){
cnt -= A[k];
A[k] = cur;
k--;
}
cnt += cur * (i - k -1);
sum += cnt;
}
//更新maxLeft;
if( A[i] > maxLeft){
maxLeft = A[i];
}
}
return sum;
}
};