定义四个变量:
leftMax表示arr[0..L-1]中的最大值
L表示位于左侧的指针变量,初始值为1
rightMax表示arr[L+1..N-1]中的最大值
R表示位于右侧的指针变量,初始值为N-2
求解容器中水容量的每一步就是R向左或者L向右进行移动,其中具体的逻辑是:
1、如果leftMax<=rightMax,那么可以求出L位置上的水量,为Max{leftMax-arr[L],0},然后L向右移动,移动之前要更新leftMax,leftMax = Max{leftMax,arr[L++]}
2、如果leftMax>rightMax,那么同样的道理,可以求出R位置上的水量Max{rightMax-arr[R],0},R向右移动的时候,也要更新rightMax(rightMax=Max{rightMax,arr[R--]})。
leftMax能够保证是arr[0..L-1]中的最大值,限定了L左侧的界限
rightMax能够保证是arr[R+1..N-1]中的最大值,限定了R右侧的界限
只要leftMax<=rightMax或者leftMax>rightMax的情况确定,无论未探索的中间区域是否有更大的值,都能计算出当前位置处的水量,因为一个位置处的水量的多少是由其左右两侧的值同时决定的。
public long maxWater (int[] arr) { if (arr == null || arr.length < 3){ return 0; } long res = 0; int leftMax = arr[0]; int rightMax = arr[arr.length-1]; int L = 1; int R = arr.length - 2; while (L <= R){ if (leftMax <= rightMax){ res += Math.max(0,leftMax - arr[L]); leftMax = Math.max(leftMax,arr[L++]); }else { res += Math.max(0,rightMax - arr[R]); rightMax = Math.max(rightMax,arr[R--]); } } return res; }