LeetCode 11 - 盛最多水的容器 - [雙指標暴力]

來源:互聯網
上載者:User

標籤:垂直   lse   segment   整數   row   存在   ble   targe   nbsp   

題目連結:https://leetcode-cn.com/problems/container-with-most-water/description/

給定 n 個非負整數 $a_1,a_2,\cdots,a_{n-1},a_n$,每個數代表座標中的一個點 $(i, a_i)$。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 $(i, ai_)$ 和 $(i, 0)$。

找出其中的兩條線,使得它們與 $x$ 軸共同構成的容器可以容納最多的水。

說明:你不能傾斜容器,且 $n$ 的值至少為 2。

樣本:

輸入: [1,8,6,2,5,4,8,3,7]輸出: 49

 

(引用來自官網上的)題解:

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

我們在由線段長度構成的數組中使用兩個指標,一個放在開始,一個置於末尾;

此外,我們會使用變數 maxarea 來持續儲存到目前為止所獲得的最大面積;

在每一步中,我們會找出指標所指向的兩條線段形成的地區,更新 maxarea,並將指向較短線段的指標向較長線段那端移動一步。

說實話,其實演算法過程非常簡單,實現起來也就個位元行的代碼,但是,怎麼證明這樣的演算法是正確的呢?

 

證明(以下參考1190000016654619):

假設最優解的容器的兩個邊界在位置 $L$ 和 $R$,高度為 $h(L)$ 和 $h(R)$,那麼根據演算法,由於每次左右指標中只有一個能移動一步,那麼必然有一個先到達兩個邊界中的一個,

不妨假設是左指標先走到 $L$,即 $l=L$;那麼此時右指標必然還沒有走到 $R$,即 $r > R$;

那麼,只要證明如下假設:接下來的每一步都只能是右指標左移一格,左指標始終不能動。就意味著我們的演算法在枚舉過程中,必然會在某一步走到最優解,從而使得演算法得到的答案正確;

採用反證法:

若上述假設不成立,則意味著如下假設成立:必然存在某一步,是左指標右移一格,而右指標沒有動;

則根據以上描述可知,在這一步的時候:$l=L<R<r$ 且 $h(l) = h(L) < h(r)$,由此可知此時邊界為 $l$ 和 $r$ 的容器的容量 $S$ 為

$S = h\left( l \right) \times \left( {r - l} \right) = h\left( L \right) \times \left( {r - l} \right)$

然而,此時我們根據 $r > R \Rightarrow r - l > R - l = R - L$ 又有

$S = h\left( L \right) \times \left( {r - l} \right) > \min \left( {h\left( L \right),h\left( R \right)} \right) \times \left( {R - L} \right)$

很明顯,$\min \left( {h\left( L \right),h\left( R \right)} \right) \times \left( {R - L} \right)$ 已經是最大的容積了,顯然不應當存在不這還大的容器,

因此,證明了假設:當左指標先走到 $L$ 時,接下來的每一步都只能是右指標左移一格,左指標始終不能動;

類似地,也可以證明,當右指標先走到 $R$ 時,接下來的每一步都只能是左指標右移一格,右指標始終不能動;

證畢。

 

AC代碼:

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

 

LeetCode 11 - 盛最多水的容器 - [雙指標暴力]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.