LeetCode 41. Trapping Rain Water O(n)実現
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[]を遍歴して出水の断面総面積を求める.
コード:
各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;
}
};