有一个数组 num[]={a1,a2,a3,.....an};
假设每一个元素的小标对应x轴上的点,而ai表示y轴的点(即高度)
明显可以用暴力法:求的每一个ai作为起点的最大面积,时间复杂度为n^2,代码如下
<span style="font-size:18px;">class Solution {
public:
int maxArea(vector<int> &height) {
int i,j;
int temp;
int sum=0;
for(i=0;i<height.size()-1;i++)
{
temp=0;
for(j=i+1;j<height.size();j++)
{
temp=min(height[i],height[j])*(j-i);
if(temp>sum)
sum=temp;
}
}
return sum;
}</span>
接下来求一个时间复杂度为n的方法。
如下图 a0~a6 分别为 2,1,1,2,5,3,4
要求最大值,从开头(s)和结尾(e)开始,因为此时长度最大(e-s最大)
此时面积为 min(a[s],a[e])*(e-s)。因为a[s]和a[e]之间的面积由最小值决定。
所以一次就求出来了以a[s],a[e]作为边界的最大面积。
如上图所示, s=0,e=6 a[s]=2,a[e]=4 那么 此时以 a[0]作为边界的最大面积就是 2*6 =12,下面再也找不出来 比a[0]作为边界更大的面积 因为此时 长度已达最大,并且a[0]<a[6] ,以小的为准。
所以,我们继续推进,因为此时a[0]作为边界的最大值已经求的,那么整个数组就不再与a[0]有关系,所以s++,0变成1. 同理如果a[e]较小,应该e--
循环 上面 继续求的 min(a[1],a[6]) * (6-1) a1<a6 对于剩下的 a1~a6 来说,此时求的a1为边界的最大面积
代码如下
<span style="font-size:18px;">class Solution {
public:
int maxArea(vector<int> &height) {
int sum=0;
int l=0;
int m=height.size()-1;
while(l<m)
{
int temp=min(height[l],height[m])*(m-l);
if(temp>sum)
sum=temp;
if(height[l]<height[m])
l++;
else
m--;
}
return sum;
}
};</span>