题目
-
给定一个长度为
n
的整数数组height
。有n
条垂线,第i
条线的两个端点是(i, 0)
和(i, height[i])
。找出其中的两条线,使得它们与
x
轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
**说明:**你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1] 输出:1
提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
思路
定义左侧和右侧桶坐标left=0
和right=height.size()-1
。很明显,如果左侧高度x大于右侧高度y,根据容积定义式area=min(x,y)*t
,此时改变left,无法增大min(x,y),只会减少t,故而只能导致容积减少,因此我们得到了右侧位置对应的最大容积,此后便可以去掉这个位置,对新数组进行容积计算。以此类推,当桶两侧高度不一致时,此时容积即为较低侧所能达到的最大容积。
伪代码:如果h[left]>=h[right]
,右侧right左移,直至容量上升;如果h[left]<h[right]
,左侧left右移,直至容量上升。当left==right
,结束循环。
代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int i=0,j=height.size()-1;
int maxa=min(height[i],height[j])*(j-i);
while(i<j)
{
if(height[i]<height[j])
{
i++;
if(min(height[i],height[j])*(j-i)>maxa)
{
maxa=min(height[i],height[j])*(j-i);
}
}else
{
j--;
if(min(height[i],height[j])*(j-i)>maxa)
{
maxa=min(height[i],height[j])*(j-i);
}
}
}
return maxa;
}
};