显然枚举每一列能存多少雨水,然后利用前缀后缀和,预处理一下即可。
class Solution {
public:
long long ans;
int hp[30007],hn[30007];
int trap(vector<int>& height) {
int n=height.size();
hp[0]=hn[n+1]=0;
for(int i=1;i<=n;i++)
hp[i]=max(hp[i-1],height[i-1]);
for(int i=n;i>=1;i--)
hn[i]=max(hn[i+1],height[i-1]);
for(int i=1;i<=n;i++){
ans+=max(0,min(hp[i-1],hn[i+1])-height[i-1]);
// cout<<i<<" "<<height[i-1]<<" "<<hp[i-1]<<" -> "<<hn[i+1]<<" - "<<ans<<endl;
}
return ans;
}
};