題目來源:https://leetcode-cn.com/problems/container-with-most-water/python
給定 n 個非負整數 a1,a2,...,an,每一個數表明座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器能夠容納最多的水。segmentfault
說明:你不能傾斜容器,且 n 的值至少爲 2。數組
圖中垂直線表明輸入數組 [1,8,6,2,5,4,8,3,7]。在此狀況下,容器可以容納水(表示爲藍色部分)的最大值爲 49。bash
示例:微信
輸入: [1,8,6,2,5,4,8,3,7] 輸出: 49
max_area
用以比較肯定最終最大值。定義雙指針,一個指向開始,一個指向末尾;max_area
的值大(也就是盛放的容量變大);max_area
。下圖是對指針靠攏以及容器容量變化的圖解(第一次製做,有點糙 Orz)spa
class Solution: def maxArea(self, height: List[int]) -> int: # 定義最大值,用之後續比較 # 定義雙指針,一個指向開始,一個指向末尾 max_area, l, r = 0, 0, len(height) - 1 # 雙指針向中間靠攏 while l < r: # 以較短的線爲準,與兩線之間的距離之積就是可盛放水量的值 # 與定義的最大值 max_area 比較,取大值從新賦值給 max_area max_area = max(max_area, min(height[l], height[r]) * (r - l)) # 每次移動的準則:較短的線往較長線的靠攏 # 具體緣由:往較長線移動,移動後的線若變長,雖然距離變短,當仍有可能與距離乘積變大(也就是盛放的容量變大) if height[l] < height[r]: l += 1 else: r -= 1 return max_area
以上就是本篇的主要內容
歡迎關注微信公衆號《書所集錄》