LeetCode 41. Trapping Rain Water O(n)実現

848 ワード

hackersun 007の問題解を参考にしました
各A[i]について、その両側の最高高さがmin(leftmost[i],rightmost[i])>A[i]を満たすと、座標i上の対応する水の断面積はmin(leftmost[i],rightmost[i])−A[i]となる
左から右へA[]を遍歴し、leftmost配列を求める.
A[]を逆方向に遍歴し、rightmostを求める. 
最後にleftmost[],rightmost[]を用いて,A[]を遍歴して出水の断面総面積を求める.
コード:
class Solution 
{
public:
    int trap(int A[], int n) 
    {
    	int sum = 0;
		vector<int> leftmost(n, 0), rightmost(n, 0);

		for (int i = 0, maxx = 0; i < n; ++ i)
		{
			leftmost[i] = maxx;
			maxx = maxx>A[i]? maxx: A[i];
		}
		for (int i = n-1, maxx = 0; i >= 0; -- i)
		{
			rightmost[i] = maxx;
			maxx = maxx>A[i]? maxx: A[i];
		}
		for (int i = 1; i < n-1; ++ i)
		{
			if (min(leftmost[i], rightmost[i]) > A[i])
			{
				sum += min(leftmost[i], rightmost[i]) - A[i];
			}
		}

		return sum;
    }
};