LintCode 383: Max Area
题目描述
给定 n
个非负整数 a1, a2, ..., an
, 每个数代表了坐标中的一个点 (i, ai)
。画 n
条垂直线,使得 i
垂直线的两个端点分别为(i, ai)
和(i, 0)
。找到两条线,使得其与 x
轴共同构成一个容器,以容纳最多水。
样例
给出[1,3,2]
, 最大的储水面积是2
.
Mon Feb 27 2017
思路
第一次看题目还以为是之前写的LintCode 510: Maximal Rectangle,后来发现还是不同的,最大矩形那题中间的矩形不能低于两边,而本题只需要考虑两边的高度,中间不用管。
最简单的当然就是两层遍历了,时间复杂度是 \(O(n^2)\),也能AC
还有一种时间复杂度为 \(O(n)\) 的方法,用一前一后两个指针扫描遍历,左右两条边的高度即可确定一个容器的容量。若大于当前的最大值,则更新最大值。下一步是较短的那条边步进一步,直到两者相遇。
代码
// 装最多水的容器
int maxArea(vector<int> &heights)
{
int i = 0, j = heights.size() - 1, max_vol = 0;
while(i < j)
{
int vol = (j - i) * min(heights[i], heights[j]);
if (max_vol < vol) max_vol = vol;
heights[i] < heights[j] ? ++i : --j;
}
return max_vol;
}