题目:给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
eg : 输入:[3,1,2,5,2,4],输出:5
太笨了太笨了,做过一遍了还不会。
这道题目陷入的误区是想着先确定容器,确定了之后再计算容量,但是。。。也不知道是啥原因,最后一个用例过不了,只能参考答案。
其实可以动态的确定容器和更新容器。
首先使用双指针,left 和 right 分别指向数组的两端,然后使用lMax记录左容器的高度,使用rMax记录右容器的高度,然后对整个数组进行一次遍历,需要注意的是,容器的容量是取决于短板的,需要使用最短的那一侧来确定容器的容量,因此在进行处理的时候只需要对 lMax 和 rMax 中小的那个进行处理,也就是对短板进行处理,然后动态的去更新边界和计算容量即可。
1. 每次更新 lMax 和 rMax ,取 lMax 为 max ( lMax , arr[left] ),同理取 rMax,这里更新边界是确定新的容器。
2. 判断 lMax 和 rMax 的大小,决定处理哪一边,假设 lMax < rMax,max += lMax - arr[left++],同理处理right,这里只考虑小的那边,是因为容量是有由短边确定的。
完整代码如下:
public static long maxWater (int[] arr) {
// write code here
if(arr.length==0||arr.length==1) {
return 0L;
}
long max = 0;
int left = 0,right = arr.length-1;
int lMax = arr[left];
int rMax = arr[right];
while(left<right) {
lMax = Math.max(lMax, arr[left]);
rMax = Math.max(rMax, arr[right]);
if(lMax<rMax) {
max += lMax-arr[left++];
}else {
max += rMax-arr[right--];
}
}
return max;
}