做法就是维护一个非严格递减,遇到不递减的高度,就不断地往栈中弹出元素直到栈顶元素的高度比这个大为止或者栈为空,如果栈为空,那么证明这一段的容量就可以计算出来了,如果栈不为空,那么从栈顶位置到当前位置的容量可以用这个两个高度的较低者水的水平线。
我们可以把道题看成有几个容器,我们来确定容器的两个侧边。如果左侧边比右侧边小,那么这一段容量就可以求了,因为如果后面遇到更比右侧边更大的边不会影响这个的结果。暂时先说到这,说的很不清楚,一定要好好想想怎么表达!!赶紧复习密码学去了
class Solution {public:
int trap(int A[], int n) {
if(n<=1)return 0;
vector<int > sum;
sum.resize(n);
int ans = 0;
stack<int> s;
for(int i = 0;i<n;i++){
if(s.empty()){
s.push(i);
sum[0] = A[0];
}else{
sum[i] = sum[i-1]+A[i];
if(A[s.top()]>=A[i])s.push(i);
else {
int k = s.top();
while(A[k]<A[i]){
s.pop();
if(!s.empty())k = s.top();
else break;
}
if(s.empty()){
ans+=A[k]*(i-k-1)-sum[i-1]+sum[k];
s.push(i);
}else {
s.push(i);
}
}
}
}
int t = s.top();
s.pop();
while(!s.empty()){
int u = s.top();
s.pop();
ans+=A[t]*(t-u-1)-sum[t-1]+sum[u];
t= u;
}
return ans;
}
};