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