Trap Water这道题有很多方法,扫描法
1、从左到右扫描,记录每个点左边最大的值 left_max[i]
2、从右到左扫描,记录每个点从右到左边最大的值 right_max[i]
3、从左到右扫,如果height[i]< min (left_max[i],rightmax[i]),说明在heigh[t]之上的部分有1*(height[i] - min(left_max[i],right_max[i])的水,累加进总量即可
class Solution {
public:
int trap(int A[], int n) {
vector<int> left_max(n , 0),right_max(n, 0 );
int tmp;
tmp = A[0];
for(int i = 0 ; i < n ; i++)
{
if (tmp < A[i])tmp = A[i];
left_max[i] = tmp;
}
tmp = A[n-1];
for(int i = n - 1; i >= 0 ; i-- )
{
if (tmp<A[i]) tmp = A[i];
right_max[i] = tmp;
}
int res = 0;
for(int i = 0 ; i <n ; i ++)
{
int delta = min(left_max[i],right_max[i]);
if (delta > A[i])
res += delta - A[i];
}
return res;
}
};