题目
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!
如图所示,求表示的黑色区域可以容纳的蓝色的水的数量。
记录当前的容水高度,从外向里扫描,每次使容水高度增加,
即将高度为容水高度的一侧(较低的一侧,相等时为两侧)向内移动至第一个更高的位置,
记录由于容水高度增加可以增加的容水面积,同时去除移动过程中填充物导致的容水面积的减少。
代码:
class Solution { public: int trap(int A[], int n) { int ans=0; //结果 int front=0,back=n-1; //头尾位置 int high=0; //容器的最高容水高度 int nf,nb; //扫描下一个头尾 while(front<back) { if(A[front]==high) //头是目前的容水高度,向后移动头 { nf=front; while(nf<back&&A[nf]<=high) //减去填充的体积 ans-=A[nf++]; front=nf; } if(A[back]==high) //尾是目前的容水高度,向前移动尾 { nb=back; while(nb>front&&A[nb]<=high) //减去填充的体积 ans-=A[nb--]; back=nb; } if(front<back) //存在有效的容水空间 { ans+=(back-front+1)*(min(A[front],A[back])-high); //需要把壁也算进去(会被减掉) high=min(A[front],A[back]); } } ans-=high; //处理最后最高的壁水下部分去除 return ans; } };