分析:最简单的是暴力法,即列举所以可能的组合,此法要嵌套扫两遍,所以复杂度为o(n^2).
然而此题可以用o(n)的复杂度解决,原因在于水桶原理,即关注短板。可以从两端开始,从短的一遍向内重选边,因为可能找到一个更长的边来抵消x轴减小带来的影响,并使高度与x轴乘机变大。重复上述步骤,直到两边重合。因此复杂度为o(n)。
代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int first = 0, second = height.size() - 1, maxA = 0;
int high;
while (first < second)
{
high = min(height[first], height[second]);
maxA = max(maxA, high * (second - first));
while (height[first] <= high && first < second) ++first;
while (height[second] <= high && first < second) --second;
}
return maxA;
}
};
测试通过: