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.
求(i-j)*min(ai,aj)的面积,这里其实就是求任意两个隔板间最大的装水量,为距离与较低隔板的高度的乘积。暴力破解就是O(n2),但是这里我们知道整个面积受两个因素的影响,一个是长度abs(i-j),当i、j分别为数组的首尾时最大,然而此时的min(ai,aj)不一定是最优的。因此从两端往中间遍历,最大面积的j的右端不会有比它高的线,i的左边也不会有比它高的线。所以对于每个当前的较小的线,往右或者往左查找第一个比height[i]高的数值作为可能的备选得到面积。
class Solution {
public:
int maxArea(vector<int>& height) {
int area = 0;
int n = height.size();
if(n<=0) return area;
/*for(int i=0;i<n-1;i++) //暴力解决
for(int j= i+1;j<n;j++)
{
int a = j-i;
int b = height[i]>height[j]?height[j]:height[i];
if(area<a*b)
area = a*b;
}*/
//由于长最长的时候一定是整个数组的长度,但是高可能会影响,所有每次从两边往中间值,存放可能出现最大值的暂存值
int i=0,j=n-1;
while(i<j)
{
int b = height[i]>height[j]?height[j]:height[i];
if((j-i)*b > area)
area = (j-i)*b;
if(height[i]<height[j])
{
int temp = i;
while(height[temp]<=height[i]&&temp<j)//找到第一个比height[i]高的数值作为可能的备选
++temp;
i = temp;
}else
{
int temp = j;
while(height[temp]<=height[j]&&temp>i)
--temp;
j = temp;
}
}
return area;
}
};