盛最多水的容器(雙指針,短的向中間移)

這道題有些面善,大二的時候去參加字節跳動的筆試,有一道算法題就是這個,我當時可能寫的是窮舉

 

q


我自己寫的是窮舉,時間複雜度是O(n^2)

class Solution {
public:
    int maxArea(vector<int>& height) {
        int max=0;
        int c;
        for(int i=0;i<height.size()-1;i++){
            for(int j=i+1;j<height.size();j++){
                c=(j-i)*min(height[i],height[j]);
                max=max>c?max:c;
            }   
        }
        return max;
    }
};

而官方提出來的解決方案是雙指針,真的很簡單,從兩端向中間移,短的一段向中間移,因爲長的移的話沒有任何意義,不會增加面積:https://leetcode-cn.com/problems/container-with-most-water/solution/sheng-zui-duo-shui-de-rong-qi-by-leetcode/

這種方法背後的思路在於,兩線段之間形成的區域總是會受到其中較短那條長度的限制。此外,兩線段距離越遠,得到的面積就越大。

我們在由線段長度構成的數組中使用兩個指針,一個放在開始,一個置於末尾。 此外,我們會使用變量 maxareamaxarea 來持續存儲到目前爲止所獲得的最大面積。 在每一步中,我們會找出指針所指向的兩條線段形成的區域,更新 maxareamaxarea,並將指向較短線段的指針向較長線段那端移動一步。

class Solution {
public:
    int maxArea(vector<int>& height) {
        int max=0;
        int fi=0,la=height.size()-1,c;
        while (fi!=la)
        {
            c=(la-fi)*min(height[la],height[fi]);
            max=max>c?max:c;
            if(height[fi]>height[la])
                la--;
            else
                fi++;
        
        }
        return max;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章