难度:3
题意:
给一列数a[0],a[1],,,a[n-1],取其中两个数a[i],a[j]使得min(a[i],a[j])*(j-i)最大
普遍的解法是设置两个索引,分别从左往右,从右往左移动
每次选择a值小的移动
实践证明这个做法是对的,但是这样真的能够遍历到所有情况的证明还没看见,暂时理解为未证明的贪心
class Solution
{
public:
int maxArea(vector<int> &height)
{
int l=0,r=height.size()-1;
int ans=min(height[l],height[r])*(r-l);
while(l<r)
{
if(height[l]<height[r])
{
int tmp=height[l];
while(l<r&&height[l]<=tmp)
{
l++;
}
ans=max(ans,min(height[l],height[r])*(r-l));
}
else
{
int tmp=height[r];
while(l<r&&tmp>=height[r])
{
r--;
}
ans=max(ans,min(height[l],height[r])*(r-l));
}
}
return ans;
}
};