给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai)
。画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)
和(i, 0)
。找到两条线,使得其与 x 轴共同构成一个容器,以容纳最多水。
样例
给出[1,3,2]
, 最大的储水面积是2
.
注意
容器不可倾斜。
分析:采用两边逼近法,显而易见,当逐渐逼近的时候,容器的长在变短,那么要使得面积增大的话,宽必须要变大,所以我们保留长的那条线段,使得短线段向另一方逐渐逼近。
代码:
class Solution {
public:
/**
* @param heights: a vector of integers
* @return: an integer
*/
int maxArea(vector<int> &heights) {
// write your code here
int ret = 0;
int r = heights.size()-1;
int l = 0;
while (l < r)
{
ret = max(ret,min(heights[l],heights[r])*(r-l));
if(heights[l]<heights[r])
l++;
else
r--;
}
return ret;
}
};