Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
给定一个数组,记录其任意两子元素间所围成的面积区域最大值。
直观的解法是暴力遍历,类似冒泡一样,设置两个指针,分别从左到右遍历数组,计算出最大值。当然,这样一点也不优雅,下面我们来讨论一种优雅的方式:
所求的面积为距离和高度的成绩,我们设置两个指针,分别从左和右侧往中间夹逼,若左边的高度小于右边的高度,则左边向中间移动,否则右边移动。使用一个值来记录过程中的最大值,即为所求结果。整个数组每个元素仅遍历了一次,故时间复杂度为O(n),这部分算法的证明可参见:https://blog.csdn.net/kid551/article/details/83094787。
代码记录如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int ret = 0;
if(height.empty())
return ret;
int left = 0, right = height.size() - 1;
while(left < right)
{
if(height[left] < height[right])
{
ret = max(ret, height[left] * (right - left));
left++;
}
else
{
ret = max(ret, height[right] * (right - left));
right--;
}
}
return ret;
}
};
参考链接: