1. 程式人生 > >【Leetcode】Python實現盛最多水的容器

【Leetcode】Python實現盛最多水的容器

給定 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

注意:你不能傾斜容器,n 至少是2。

分析題意,為和y軸平行的直線,主要在兩者下標為寬,直線ai為高,兩者相乘求最大面積,使用逼近法

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
""" 逼近法 每次左右兩端都捨去短的那一端 若選擇短的那一端【S=小於等於此端的高*小於等於當前的最大區間長度】 至多的面積也是選擇最左最右的一個矩形,因此不必再考慮短的一端,直接捨去逼近 """ # 記錄當前最大容量的面積 max_area = 0 # 記錄最左邊的下標 left = 0 # 記錄右邊的下標 right = len(height) - 1 # 當右邊下標大於左邊下標的時候迴圈
while right > left: # 當前迴圈中最大的容量面積,使用max方法比較上次的max_area和此次的容量面積,取最大值 # min(height[left], height[right]) * (right - left) 取左邊和右邊的高當中的最小值, 下標right-left為寬,兩者相乘為最大面積 max_area = max(max_area, min(height[left], height[right]) * (right - left)) # 判斷哪條高小,小的那邊下標進行操作
if height[right] > height[left]: left += 1 else: right -= 1 return max_area