定义四个变量:
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;
}
京公网安备 11010502036488号