题目描述
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
具体请参考样例解释
示例1
输入
[3,1,2,5,2,4]
返回值
5
说明
示例2
输入
[4,5,1,3,2]
返回值
2
备注:
1 \leq N \leq 10^61≤N≤106
import java.util.*;
public class Solution {
/**
* Java版 《容器盛水问题》
* 思路分析:
* 因为要该容器是一个高低不平的容器,所以我们直接找出容器的左右边界,很明显,
* 为了不让水溢出来,容器的边界肯定取那个更低的。
* 然后使用双指针,分别从两边往中间扫描,
* 如果此时左边arr[left]的高度小于右边的高度时,
* 左指针向右扫描+1,如果此时当前位置的高度小于容器的边界高度,
* 那么意味着此位置可以盛水;反之,则右指针向左扫描-1。
* @param args
*/
public long maxWater (int[] arr) {
if(arr.length == 0 || arr.length <= 2){
return 0;
}
int left = 0;
int right = arr.length-1;
int min = Math.min(arr[left],arr[right]);
long result = 0;
while(left < right){
if(arr[left] < arr[right]){
left++;
//如果当前水位小于边界,则可以装水
if(arr[left] < min){
result += min-arr[left];
}else{
min = Math.min(arr[left],arr[right]);
}
}else{
right--;
if(arr[right] < min){
result += min-arr[right];
}else{
min = Math.min(arr[right],arr[left]);
}
}
}
return result;
}
}