對於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;
}
};