双指针方法解决储水问题
import java.util.*;
public class Solution {
public long maxWater (int[] arr) {
if(arr.length == 0 || arr.length <= 2)
return 0;
int left = 0, right = arr.length-1;
long res = 0;
//取低的为边界
int min = Math.min(arr[left],arr[right]);
while(left < right){
// 如果左边界小于右边界
// 则储水量边界应该从左侧算起
// 现在arr[left]作为左边的墙体
if(arr[left] < arr[right]){
// 判断墙体右边是否可以储水
left++;
// 如果墙体右边的墙体高度小于边界墙体
// 说明此处可以储水
if(arr[left] < min){
res += min - arr[left];
}
// 如果墙体右边的墙体高度大于边界墙体
// 说明现在边界墙体应该改变了
else{
min = Math.min(arr[left],arr[right]);
}
}
// 如果右边界小于左边界
// 则储水量边界应该从右侧算起
// 现在arr[right]作为右边的墙体
else{
right--;
if(arr[right] < min){
res += min - arr[right];
}
else{
min = Math.min(arr[left],arr[right]);
}
}
}
return res;
}
} 
京公网安备 11010502036488号