题目
请点击
思路
- 双指针遍历,每次求得i与j的下标之差作为边l1,用height[i]与height[j]中的最小值作为边l2(因为肯定不能超出最小边)
- 若当前面积大于保存的最大面积则更新
- 否则
- 若height[i]<height[j],说明左边较小,则i++
- 若height[i]>height[j],说明右边较小,则j–
- 若相等,则i++,j–
代码
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int maxArea(vector<int>& height) {
int size=height.size();
int i=0,j=size-1,maxAre=0;
while (i < j)
{
int l1=j-i,l2=min(height[i],height[j]);
int area=l1*l2;
if(area>maxAre) maxAre=area;
else {
if(height[i]<height[j]) i++;
else if(height[i]>height[j]) j--;
else {
i++;
j--;
}
}
}
return maxAre;
}
int main(){
vector<int> height;
height.emplace_back(1);
height.emplace_back(8);
height.emplace_back(6);
height.emplace_back(2);
height.emplace_back(5);
height.emplace_back(4);
height.emplace_back(8);
height.emplace_back(3);
height.emplace_back(7);
int aera=maxArea(height);
cout<<aera<<endl;
return 0;
}