// 两次遍历:从左向右得到动态最大值;从右到左得到动态最大值
long long maxWater(int* arr, int arrLen )
{
// write code here
long long res=0;
int i=0;
int max=0;
int a[arrLen];
a[0]=arr[0];
int b[arrLen];
b[arrLen-1]=arr[arrLen-1];
for(i=0;i<arrLen;i++) // 从左向右遍历
{
max=fmax(max,arr[i]);
a[i]=max;
}
max=0; // 重置最大值
for(i=arrLen-1;i>-1;i--) // 从右向左
{
max=fmax(max,arr[i]);
b[i]=max;
}
for(i=0;i<arrLen;i++)
{
res+=(fmin(a[i],b[i])-arr[i]); // 取两次最大值的最小值与 arr 元素相减就是该元素位置接到的雨水,加入结果中
}
return res;
}

京公网安备 11010502036488号