//采用双指针,先分别找到左边和右边的峰点,
如果左边的值较小,则左指针右移,该处的值与左边峰点的值的差值即为该处接到的雨水值
如果右边的值较小,则右指针左移,该处的值与右边峰点的值的差值即为该处接到的雨水值
知道找到一个值大于峰点,则该出成为新的峰点,循环查找,知道左右指针相遇;
import java.util.*;
public class Solution {
/**
* max water
* @param arr int整型一维数组 the array
* @return long长整型
*/
public long maxWater (int[] arr) {
// write code here
if (arr.length < 2) {
return 0;
}
Long res = 0L;
int left = 0;
int right = arr.length - 1;
while (left < right - 1) {
while (left < right - 1 && arr[left] < arr[left + 1]) {
left++;
}
while (left < right - 1 && arr[right] < arr[right - 1]) {
right--;
}
int hight = Math.min(arr[left], arr[right]);
if (arr[left] < arr[right]) {
while (left < right) {
left++;
if (arr[left] > hight) {
break;
}
res += hight - arr[left];
}
} else {
while (left < right) {
right--;
if (arr[right] > hight) {
break;
}
res += hight - arr[right];
}
}
}
return res;
}
}