11 Container With Most Water的數學證明 | LeetCode
Given n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
Example: Input: [1,8,6,2,5,4,8,3,7] Output: 49
網上給出的最優演算法都比較類似,其基本想法是:將挑選的兩條邊分別從兩端開始向中間移動,每一次只能移動兩條邊中的一條。每次移動的標準是將較小的那條邊往中間移動一格。如果移動後的面積有所增長,則將面積最大值更新。當兩條邊相遇時,則停止。
網上幾乎都只有這個演算法的描述,而沒有提供一個嚴格的數學證明。和好友Meiyf討論後,整理出這個演算法的數學證明。
考慮分佈在左右兩邊的移動指標,它們分別從兩端開始,通過右移、左移的方式,來搜尋最優解。
假設最優解為,則我們有:。根據演算法的移動方式,總是可以通過“從右移、從左移”若干步的方式,到達。
由於演算法每一次只能移動一步(即右移一步或左移一步),所以兩種情況:
- 先到達
- 先到達
必然有一種先發生。不妨假設先到達(那麼此時,也就還未通過左移到達,它還在的右側)。那麼,我們只需證明:
在現有的演算法下,後續的更新步驟__都只能是__:不斷左移、直到到達。
我們可以通過反證法來證明上述結論。
令函式表示點對應的線段長度,令表示點和構成的線段長度。
若假設不成立,則存在某一步:在還未通過左移到達時,停留在的需要右移一步。
下面我們來證明不可能出現上面這種情況。
若上述發生,則我們有以下結論:
- 。因為根據演算法,只有長度更小的那一條邊才能向中間移動。所以,只有當小於時,才可能出現右移。
由此,我們可以得到由兩條邊形成的面積為:
這裡的高度之所以取為,是因為上面第2條已經說明了比小。
而此時,因為第1條已經說明,所以。所以我們有:
矛盾。所以假設命題不成立,進而當到達後,後續的所有更新步驟都只能是不斷左移、直到到達。
所以,在這樣的演算法之下,一定能夠到找到面積的最優解。