[Leetcode解題] Container With Most Water - 使用前後指針解
11 February 2022
medium
greedy
two-pointers
題目
11. Container With Most Water 給定一個長度為 $n$ 的整數數組 $height$,在平面直角坐標系上有 $n$ 條垂直線,其中第 $i$ 條線的兩端點分別為 $(i, 0)$ 和 $(i, height[i])$。 找到兩條線,與 $x$ 軸一起形成一個容器,使得該容器包含最多的水。 返回容器可以存儲的最大水量。
解題思路
該代碼使用兩個指針 $left$ 和 $right$,分別指向數組的頭尾。每次比較 $height[left]$ 和 $height[right]$ 的值,然後移動較小值的指針。這樣,對於數組中的每個點,都會計算一次與其相鄰的兩個點的組合的面積。最後,我們可以返回最大的面積。
實作
class Solution:
def maxArea(self, height: List[int]) -> int:
left, right = 0, len(height) - 1
max_area = 0
while left < right:
width = right - left
if height[left] < height[right]:
max_area = max(max_area, height[left] * width)
left += 1
else:
max_area = max(max_area, height[right] * width)
right -= 1
return max_area
複雜度
這個算法的時間複雜度是$O(n)$。因為每一個元素最多只會被訪問一次,所以時間複雜度隨著$n$的增加而線性增長。