1.暴力法
代码如下
class Solution {
public:
int maxArea(vector<int>& height) {
int imax=0;
for(int i=0;i<height.size()-1;i++)
for(int j=i+1;j<height.size();j++)
{
int num=min(height[i],height[j]);
imax=max(imax,num*(j-i));
}
return imax;
}
};
结果超时
2.双指针
首先设指针Left指向第一个元素,指针right指向最后一个元素
此时容器的底是最宽的,高位height[left],height[right]的最小值
当指针移动时,无论是left右移还是right左移,容器的底都是变小的,且left+1,与rihgt-1两种操作容器的底的宽度都是一样的,能改动的就是容器的高,此时,我们判断height[left],height[right]哪一个值小,放弃较小的值,保留较大的值,这样容器的面积才可能增大
设指针未移动指针面积为min(height[left],height[right])*(right-left)
则移动后的宽为right-left-1
如果不放弃较小的值,假设height[left]较小,即保留height[left],则此时容器的高为 min(height[left],height[right-1]), 高一定小于等于height[left],,,,,,,且宽度变小了,所以此时容器的面积一定小于之前的,故应该保留较大的值
代码如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int len=height.size();
int left=0,right=len-1;
int ans=0;
while(left<right)
{
ans=max(ans,(right-left)*min(height[left],height[right]));
if(height[left]<height[right])
left++;
else
right--;
}
return ans;
}
};