題目在這:https://leetcode-cn.com/problems/container-with-most-water/
思路分析:
本題容易想到使用雙指針維護水桶的左邊和右邊。
開始時,L指向最左端,R指向最右端。
我們将較垂直高度短的那一邊往裡面挪動。
為什麼移動較短的一邊?
(本題重點,必看!)
面積取決于短闆高度和底面長度
面積 = 短闆高 * 底面長
無論是移動短闆或者長闆,我們都隻關注移動後的新短闆會不會變長,所構成面積會不會變大,而每次移動的木闆都隻有三種情況,比原闆短,比原闆長,與原闆相等;
如果向内移動短闆,對于新的木闆 1.比原闆更短,則新面積更小,2.比原闆更長,則新面積可能變大或不變,3.和原木闆相等,則新面積變小;
def maxArea(self, height: List[int]) -> int:
left = 0
right = len(height) - 1
area = 0
while left < right:
cur = min(height[left], height[right]) * (right - left) # 面積 = 短闆高 * 底面長
area = max(area, cur)
# 較短的垂直線往中間移動
if height[left] < height[right]:
left += 1
else: # 長的往中間動
right -= 1
return