思路:
先判断 最左最右哪边高,如果右边高于左边则 先执行 左边的循环,
left_max用来记 当前柱子height[i] 与左边最大的值left_max比较(因为左边小于右边,所以只有小于左边,才能存储水),且存储的水量为 left_max 和当前柱 height[i]的差值。
同理,当遍历到有一个柱的高度高于右边,就将该柱当最高,然后开始从右往左遍历,这里遍历的是比右边小的 height[right] (与左边的同理,只有这样才能存储水,因为这时,左边最高,以左最大left_max和右最大right_max作为桶,当前的柱高度作为厚度,那么存储的水量自然就是与右最大right_max的差值)
public long maxWater (int[] arr) { //双指针 ,分别为左、右、左最大、右最大,返回值ans int left=0,right=arr.length-1, left_max=0,right_max=0; long ans=0L; //循环 while(left<right){ //当 left=right时,此时表示的是同一个柱子,循环则结束 if(arr[left]<arr[right]){ //判断左边高还是右边高,如果右边高进入下面的if判断 if(arr[left]>left_max){ //进入到这里,是右边高于左边,如果柱子高度大于左边最大left_max则存不了水,就存当前为最大,进入下一次if判断(这里有left++) left_max=arr[left]; //左边最大置于 目前所处的arr[left] }else{ //如果小于左边最大left_max,这时符合桶的含义,可以存储水量,但这时左边最高left_max<右边最高right_max ans+=left_max-arr[left]; //这里已经确定了左边的最大值小于右边的right } left++; //进行下一次判断 //与上面同理 }else{ if(arr[right]>right_max){ right_max=arr[right]; }else{ ans+=right_max-arr[right]; } right--; } } return ans; }