import java.util.*; public class Solution { /** * Java版 《容器盛水问题》 * 思路分析: * 因为要该容器是一个高低不平的容器,所以我们直接找出容器的左右边界,很明显, * 为了不让水溢出来,容器的边界肯定取那个更低的。 * 然后使用双指针,分别从两边往中间扫描, * 如果此时左边arr[left]的高度小于右边的高度时, * 左指针向右扫描+1,如果此时当前位置的高度小于容器的边界高度, * 那么意味着此位置可以盛水;反之,则右指针向左扫描-1。 * @param args */ public long maxWater (int[] arr) { if(arr.length == 0 || arr.length <= 2){ return 0; } int left = 0; int right = arr.length-1; int min = Math.min(arr[left],arr[right]); //注意 这里一定要为long类型 否则有情况会超出Integer类型数值范围 long result = 0; while(left < right){ if(arr[left] < arr[right]){ left++; //如果当前水位小于边界,则可以装水 if(arr[left] < min){ result += min-arr[left]; }else{ min = Math.min(arr[left],arr[right]); } }else{ right--; if(arr[right] < min){ result += min-arr[right]; }else{ min = Math.min(arr[right],arr[left]); } } } return result; } }