天天看點

力扣(leetcode) 11. 盛最多水的容器 (短闆木桶原理詳解)

題目在這​​: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