这篇文章距离最后更新已过1281天,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
地址
https://leetcode.com/problems/trapping-rain-water/description/
题目
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!
思路
假如从i开始,找到后面第一个大于等于h[i]的数,然后计算答案。如何后面没有大于等于h[i]的数,那么就找到i后面最大的一个数,计算答案。
代码
class Solution {
public:
int trap(vector<int>& h) {
if(h.size()==0)
return 0;
int n=h.size(),ans=0,pre[100000];
pre[0]=h[0];
for(int i=1;i<n;i++) pre[i]=pre[i-1]+h[i];
for(int i=0;i<n-1;i++)
if(h[i])
{
int d=-1,dh,ff=0;
for(int j=i+1;j<n;j++)
if(h[j]>=h[i])
{
ans+=min(h[i],h[j])*(j-i-1)-(pre[j-1]-pre[i]);
i=j-1,ff=1;
break;
}
else if(d<0||h[j]>dh)
d=j,dh=h[j];
if(d>0&&!ff)
ans+=dh*(d-i-1)-(pre[d-1]-pre[i]),i=d-1;
}
return ans;
}
};