题目
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
示例1
输入:
[3,1,2,5,2,4]
返回值:
5
示例2
输入:
[4,5,1,3,2]
返回值:
2
思路:
左右高中间低时就会盛水。假如中间没有起起伏伏,都比左右两边矮,比较左右两边,取最小值,中间比最小值低的,就可以盛雨水,盛的数量就是min-这个值,可以从左向右遍历也可以从右向左遍历。
假如中间遇到比min高的,那么就以这个为新的左/右边,继续重复上面过程,直到左右两边相遇。
先从左向右还是先从右向左都没有关系。
代码:
public class Solution {
/**
* max water
* @param arr int整型一维数组 the array
* @return long长整型
*/
public long maxWater (int[] arr) {
if(arr.length < 2){
return 0;
}
int i = 0;
int j = arr.length - 1;
long res = 0;
int min = 0;
while(i < j && i < arr.length && j < arr.length){
min = Math.min(arr[i],arr[j]);
//从左往右
while(i < j && arr[i] <= min){
res += min - arr[i];
i++;
}
//从右往左
while(i < j && arr[j] <= min){
res += min - arr[j];
j--;
}
}
return res;
}
}