/**
* max water
* @param arr int整型一维数组 the array
* @param arrLen int arr数组长度
* @return long长整型
*/
/******************************************************************************
* 定义边界left和right,left是左边界,初值是0;right值右边界,初值是arrLen-1
* 定义i和j,i初始时为左边界left,j初始为右边界
* ①、++i向右遍历
* arr[i]小于左边界说明可能有雨水,进行累加
* arr[i]不小于左边界说明没雨水,更新左边界left值为i
* ②、--j向左遍历
* arr[j]小于右边界说明可能有雨水,进行累加
* arr[j]不小于右边界说明没雨水,更新右边界right值为j
* 使用while循环计算雨水总和,循环条件是i<j
*【当左边界arr[left]<arr[right]时,说明左侧有可能有雨水,进行①操作,否则进行②操作】
******************************************************************************/
long long maxWater(int* arr, int arrLen ) {
// write code here
int left = 0;//左边界
int right = arrLen-1;//右边界
long long water = 0;
int i = left;//++i从左边界向右找,若arr[i]大于左边界arr[left],将左边界值arr[left]更新为arr[i]
int j = right;//--j从右边界向左找,若arr[j]大于左边界arr[left],将左边界值arr[left]更新为arr[i]
while(i < j)
{
//如果arr[left]小于arr[right],说明左侧可能有雨水量
if(arr[left] < arr[right])
{
//从左边界向右进行判断,如果右侧数值小于左边界,说明有雨水,进行相加
if(arr[++i] < arr[left])
water += arr[left]-arr[i];
else
//从左边界向右找,一直找到不小于左边界的值,更新左边界
left = i;
}
//如果arr[left]不小于arr[right],说明右侧可能有雨水量
else
{
//从右边界向左进行判断,如果左侧数值小于右边界,说明有雨水,进行相加
if(arr[--j] < arr[right])
water += arr[right]-arr[j];
else
//从右边界向左找,一直找到不小于右边界的值,更新右边界
right = j;
}
}
return water;
}