image.png

思路:双指针

  • 有序性是使用双指针法的基本保证
  • 左指针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