对于height[i],
指针左右两端向中间走,遇见高度不低于height[i]的位置停下,rt-lf即为容器的宽。
class Solution {
public:
int maxArea(vector<int>& height) {
int lf,rt,mm=0;
for(int i=0;i<height.size();i++)
{
lf=0;
rt=height.size()-1;
while(lf<i&&height[lf]<height[i])
lf++;
while(rt>i&&height[rt]<height[i])
rt--;
mm=max(mm,height[i]*(rt-lf));
}
return mm;
}
};
但是速度很糟糕。
改进
面积=宽*高
最开始宽设最大,指针各指一端,但是高可能并不好,由于高受限于两侧,所以双指针哪里的高更低就向内移动
,牺牲掉一个单位的宽,换取更好的高,最终才可能获得更好的乘积。
如果双指针对应高度相等,移动谁呢?
如果说两者相等仍不是最优解,那必然存在(x,y)在(lf,rt)中,height[x]>height[lf] height[y]>height[rt]
先移动谁都是可行的,一方变高之后,另一方就会移动。
class Solution {
public:
int maxArea(vector<int>& height) {
int lf=0,rt=height.size()-1,mm=0;
while(lf<rt)
{
mm=max(mm,min(height[lf],height[rt])*(rt-lf));
if(height[lf]<=height[rt])
lf++;
else
rt--;
}
return mm;
}
};