盛最多水的容器

題目描述:html

給定 n 個非負整數 a1,a2,...,an,每一個數表明座標中的一個點 (iai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (iai) 和 (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
        
相關文章
相關標籤/搜索