题目要求:
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
C++代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int water = 0;
int i =0 , j = height.size()-1;
while(i < j){
int h = min(height[i],height[j]);
water = max(water,(j-i)*h);
while(height[i] <= h && i < j)
i++;
while(height[j] <= h && i < j)
j--;
}
return water;
}
};
结果:
论坛看到的方法,这效果也忒好了吧!!
链接如下:
解析:
论坛原文是这样解释的:
Start by evaluating the widest container, using the first and the last line. All other possible containers are less wide, so to hold more water, they need to be higher. Thus, after evaluating that widest container, skip lines at both ends that don't support a higher height. Then evaluate that new container we arrived at. Repeat until there are no more possible containers left.
即先计算最宽的容器,使用第一行和最后一行。其他所有可能的容器都没这么宽,然后所以为了可以容纳更多的水,我们需要使得高度更高。因此,在评估最宽的容器之后,在两端跳过不支持较高高度的h。然后评估我们到达的新容器。重复这样做,直到没有可能的容器剩下。