Leetcode練習 #11 Container With Most Water

題目簡析:這題目我覺得是蠻坑爹的,因爲題目的語境要求使得“容器”最大,但是類名卻是maxarea,以及想破頭腦都想不出兩條線如何跟x軸組成容器,經過思考,我覺得這個模型應該是省略容器底部的寬(或者長),假設其爲一個缺省值,那麼問題的重心就從體積這個問題轉化到求側面積——即長乘高(或寬乘高),加上最後一句不能傾斜的提醒,自然是木桶效應,即指a1a2之最小者將限制木桶高度,用圖拍表示就是



           這個底部寬度值x值假設爲缺省值,那麼問題就簡化成再i-a平面中找出最大矩形面積的問題了,即如下圖:



最簡單的方式就是進行一次二階遍歷,複雜度On²),但是顯然超時,因此我們可以採取貪心算法。我們先取最大的底長——即na0或者an的最小值作爲高,得到第一個maxarea,接着我們讓較短邊(假設是a0邊),不斷往右移動,直至找到一條比a0高的邊ak,那麼我們就有了一個比原來更大的高(也許是ak也許是an,取兩者較小值),雖然此時底長n減少爲n-k,但是我們重新計算此時的面積,看能否找到比原來更大的maxarea,如此這般,最多隻要O(n)的複雜度即可完成遍歷

因此我們可以設置left和right兩個標記,分別從兩端,每次取長度低者,將標記往中間靠攏以獲取一個比原來的高度,並更新maxarea。


以下貼上代碼

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left=0;
        int right=height.size()-1;
        int max;
        int temparea;
        if(height[left]<=height[right])
            max=(right-left)*height[left];
        else
            max=(right-left)*height[right];
        int i,j;
        while(right>left){
            if(height[left]<=height[right]){
                for(i=left;i<right;i++){
                    if(height[i]>height[left])
                        break;
                }
                left=i;      
            }
            else{
                for(j=right;j>left;j--){
                    if(height[j]>height[right])
                        break;
                }
                right=j;             
            }
            if(height[left]<=height[right])
                temparea=height[left]*(right-left);
            else
                temparea=height[right]*(right-left);
            if(temparea>max)
            max = temparea;           
        }
        return max;
    }
};

Submission Result: Accepted

Runtime: 0 ms


題目鏈接:https://leetcode.com/problems/container-with-most-water/description/

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