问题描述:给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
![](https://gitee.com/duhouan/ImagePro/raw/master/leetcode/l_1.png)
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
//思路:对撞指针
//假设有左指针和右指针,且左指针指向的值小于右指针的值。
//假如我们将右指针左移,则右指针左移后的值和左指针指向的值相比有三种情况:
//(1)右指针指向的值大于左指针:这种情况下,容器的高取决于左指针,但是底变短了,所以容器盛水量一定变小
//(2)右指针指向的值等于左指针:这种情况下,容器的高取决于左指针,但是底变短了,所以容器盛水量一定变小
//(3)右指针指向的值小于左指针:这种情况下,容器的高取决于右指针,但是右指针小于左指针,且底也变短了,所以容量盛水量一定变小了
// 反之,情况类似。
// 综上所述,容器高度较大的一侧的移动只会造成容器盛水量减小。
// 所以应当移动高度较小一侧的指针,并继续遍历,直至两指针相遇。
class Solution {
public int maxArea(int[] height) {
if(height.length<=1){
return 0;
}
int l = 0;
int r = height.length-1;
int max = 0;
while(l<r){
//如何判断判断时想左以,还是向右移
int tmp = (r-l)*Math.min(height[l],height[r]);
if(tmp > max){
max = tmp;
}
if(height[l]<height[r]){
l++;
}else{
r--;
}
}
return max;
}
}
参考:
标签:容器,指向,变短,height,水量,指针 From: https://www.cnblogs.com/i9code/p/18005401