思路:双指针
- 有序性是使用双指针法的基本保证
- 左指针
left_boundary
指向0
,右指针right_boundary
指向len(height) - 1
- 如果左指针位置的
height
小于右指针位置的height
,那么将左指针往右移动。反之将右指针往左移动。总之,移动小的,确保大的不动。 - 如果确保我们的遍历过程当中,一定得到了最大的面积?因为如果不动小的那一侧,而是去动大的,那么下面得到的所有容器,一定比当前容器小。这就说明,小的那一次必然不会作为边界,所以,放弃掉小的那一侧,继续去试大的那一侧。这就是本题有序性的由来。
代码:
class Solution: def maxArea(self, height: List[int]) -> int: # 双指针的核心要义就是有序性 left_boundary, right_boundary = 0, len(height) - 1 max_area = 0 while left_boundary < right_boundary: max_area = max(max_area, min(height[left_boundary], height[right_boundary]) * (right_boundary - left_boundary)) # 只动小的,确保大的不动,这是控制有序性的手段 if height[left_boundary] < height[right_boundary]: left_boundary += 1 else: right_boundary -= 1 return max_area