思路:
将数组中每个位置上的累加起来就是总的水量
首先求容器边界,
然后使用双指针,
分别从两边往中间扫描,
当左边的高度小于右边的高度时,左指针++,
如果此时当前位置的高度小于容器的边界高度,这个位置上方有水,进行水量累加。
反之,则右指针向左扫描-1
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 < 3){
return 0;
}
int i = 0;
int j = arr.length - 1 ;
int min = Math.min(arr[i], arr[j]);//找出左右边界的最小值作为水位高度
long res = 0;
while(i < j){
if(arr[i] < arr[j]){ //如果左边较低,则左边界向右遍历, 否则右边界向左移动
i++;
if(arr[i] < min){ //如果当前标尺小于水位,则水量累加
res += min - arr[i];
}else{
min = Math.min(arr[i], arr[j]); //否则,将此标尺和右边边界高度进行比较,找出剩下数组中的新水位
}
}else{
j--;
if(arr[j] < min){
res += min - arr[j];
}else{
min = Math.min(arr[j], arr[i]);
}
}
}
return res;
}
}