问题描述
容器最多能称多少水,因为容器的高度是一个数组,我们可以通过遍历数组,计算每一格子的盛水量,累加得最高的盛水量。
示例
示例1
输入
[3,1,2,5,2,4]
输出
5
解决思路
分析
- 容器最多能称多少水,因为容器的高度是一个数组,我们可以通过遍历数组,计算每一格子的盛水量,累加得最高的盛水量。
方法
- 暴力求解:遍历元素,以当前元素为基准,向左找最高的高度leftHeight,向右找最高的高度rightHeight,计算当前格子的盛水量:water=min(leftHeight, rightHeight) - curHeight
- 双指针法:从左右两边同时开始检索,分别找最高的Height,比对左右两边的Height,取低的Height,计算盛水量,然后剔除当前格子,继续计算。(注意:这里无法同时计算两边,因为我们取得是低的Height,取高的Height会存在漏水问题)
// 过程:
第0次循环:lmax = 3、rmax = 4
第0列的盛水量:0
第1次循环:lmax = 3、rmax = 4
第1列的盛水量:2
第2次循环:lmax = 3、rmax = 4
第2列的盛水量:1
第3次循环:lmax = 3、rmax = 4
第5列的盛水量:0
第4次循环:lmax = 5、rmax = 4
第4列的盛水量:2
第5次循环:lmax = 5、rmax = 4
第3列的盛水量:0
代码实现
// 思路2
public class Solution {
public long maxWater (int[] arr) {
// write code here
if(arr==null || arr.length==0) return 0L;
long ans = 0;
int l=0, r=arr.length-1;
int lmax = arr[0], rmax=arr[arr.length-1];
while(l<=r) {
lmax = Math.max(arr[l], lmax);
rmax = Math.max(arr[r], rmax);
if(lmax < rmax) {
ans += lmax - arr[l];
l++;
} else {
ans += rmax - arr[r];
r--;
}
}
return (long) ans;
}
}
时间复杂度分析:
O(N):遍历数组
空间复杂度分析:
O(1):没有使用额外的空间
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试