一 题目链接
二 题目要求
描述
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
示例
输入:[3,1,2,5,2,4]
返回值:5
输入:[4,5,1,3,2]
返回值:2
备注
1≤N≤106
三 代码思路
题目的难点在于如何理解题目的意思。
一张图读懂题目的意思。将数组看成一个凹凸不平的盆子,只有中间的槽可以用来放水。不难理解,我们只需要找到桶的边界,然后利用较短的边减去盆底高度,将所得的结果加起来即可。
利用双指针同时向中间扫描,如果左边的高度小于右边的高度,则它是桶的较矮边。左指针++,判断指针所指向的值和左边长的关系,如果大于左边长,则更新左边长。小于左边长,则使用左边长减去盆地求得这个格子存水量。
同理,右边高度小于左边,则右指针–。
累加每个格子存水量,得到最终结果。
四 代码实现
public class Solution {
public long maxWater (int[] arr) {
if(arr == null || arr.length == 0)
return 0;
long result = 0; // 总存水量
int left = 0; // 左指针
int right = arr.length - 1; // 右指针
int leftSide = arr[left]; // 左边长
int rightSide = arr[right]; // 右边长
while(left < right){
// 左边长小于右边长,左指针++
if(leftSide < rightSide){
left++;
if(arr[left] < leftSide){
result += leftSide - arr[left];
}else{
leftSide = arr[left];
}
}else{
right--;
if(arr[right] < rightSide){
result += rightSide - arr[right];
}else{
rightSide = arr[right];
}
}
}
return result;
}
}