Leetcode-11 盛最多水的容器

對於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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章