LeetCode Trapping Rain Water

题目

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;
    }
};


 

 

 

你可能感兴趣的:(LeetCode,C++,算法)