思路:
1. 单调栈:维护一个单调上升的栈,因为最大值只可能是与左边较大的木板围成。不过当输入为一个单调上升的数据时,此时算法变成了n^2.但似乎leetcode数据量不大,依然可以通过。
class Solution {
public:
int maxArea(vector<int>& height) {
int n=height.size();
int ans=0;
int a[n+3],bit[n+3];
int k=0;
a[0]=height[0];
bit[0]=1;
for(int i=1;i<n;i++)
{
for(int j=0;j<=k;j++)
{
ans=max(ans,(i+1-bit[j])*min(a[j],height[i]));
}
if(a[k]<height[i])
{
a[++k]=height[i];
bit[k]=i+1;
}
}
return ans;
}
};
2. 双指针:设两个指针,分别指向最左和最右边,依次移动较小的木板即可。
class Solution {
public:
int maxArea(vector<int>& height) {
int n=height.size();
int l=0,r=n-1;
int ans=0;
int len=n-1;
while(l<r)
{
ans=max(ans,len*min(height[l],height[r]));
if(height[l]<height[r])
{
l++;
}
else{
r--;
}
len--;
}
return ans;
}
};