【Leetcode】Python實現盛最多水的容器
阿新 • • 發佈:2019-02-11
給定 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