題目描述:html
給定 n 個非負整數 a1,a2,...,an,每一個數表明座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器能夠容納最多的水。數組
說明:你不能傾斜容器,且 n 的值至少爲 2。spa
解題思路:指針
由木桶效應咱們知道最高的水位受制於最短的那跟模板,因此兩線段之間造成的區域老是會受到其中較短那條長度的限制。此外,兩線段距離越遠,獲得的面積就越大。code
咱們在由線段長度構成的數組中使用兩個指針,一個放在開始,一個置於末尾。 此外,咱們會使用變量 maxarea來持續存儲到目前爲止所得到的最大面積。 在每一步中,htm
咱們會找出指針所指向的兩條線段造成的區域,更新 maxarea,並將指向較短線段的指針向較長線段那端移動一步。blog
最初咱們考慮由最外圍兩條線段構成的區域。如今,爲了使面積最大化,咱們須要考慮更長的兩條線段之間的區域。若是咱們試圖將指向較長線段的指針向內側移動,io
矩形區域的面積將受限於較短的線段而不會得到任何增長。可是,在一樣的條件下,移動指向較短線段的指針儘管形成了矩形寬度的減少,但卻可能會有助於面積的增大。模板
由於移動較短線段的指針會獲得一條相對較長的線段,這能夠克服由寬度減少而引發的面積減少。class
class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ ans = left = 0 right = len(height) - 1 while left < right: ans = max(ans, (right - left) * min(height[left], height[right])) if height[left] <= height[right]: left += 1 else: right -= 1 return ans
class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ left = 0 right = len(height) - 1 maxArea = 0 while left < right: b = right - left if height[left] < height[right]: h = height[left] left += 1 else: h = height[right] right -= 1 area = b*h if maxArea < area: maxArea = area return maxArea