盛最多水的容器
盛最多水的容器
题目
给定一个长度为
n
的整数数组height
。有n
条垂线,第i
条线的两个端点是(i, 0)
和(i, height[i])
。找出其中的两条线,使得它们与
x
轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
示例
思路
- 保存的水的容量只和选中的左右边界的较短的一边和这两个边界的距离有关,所以依次遍历就好
- 初始左边界为0,右边界为height.length - 1
- 每次能容纳的水为Math.max(result, Math.min(height[l], height[r]) * (r - l))
- 计算完此次选中的边界后,需要继续移动,移动的规则是
- 如果左边界小于右边界,那么左边界加一,只有这样才有可能得到更大的容积,因为短板在较短的一边,将将短的一边代替掉才有可能更好(也可能变差)
- 如果左边界大于右边界,那么右边界减一,同理向上
代码
public int maxArea(int[] height) {
int l = 0;
int r = height.length - 1;
int result = 0;
while (l < r) {
result = Math.max(result, Math.min(height[l], height[r]) * (r - l));
if (height[l] < height[r]) {
l++;
}else {
r--;
}
}
return result;
}