一、题目描述:
给定一个长度为 n n n 的整数数组 h e i g h t height height 。有 n n n 条垂线,第 i i i 条线的两个端点是 ( i , 0 ) (i, 0) (i,0) 和 ( i , h e i g h t [ i ] ) (i, height[i]) (i,height[i]) 。
找出其中的两条线,使得它们与 x x x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
-
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 -
示例 2:
输入:height = [1,1]
输出:1
- 提示:
- n == height.length
- 2 <= n <= 105
- 0 <= height[i] <= 104
二、解决思路和代码
-
解决思路(双指针法)
- 分析:假如容水量=宽度(w)×高度(h),要使得容水量最大,需要宽度尽可能大,高度尽可能大。
- 首先,使用两个指针指向两个端点 left, right,容器的 w=right-left, h=min(height[left], height[right])
- 在初始状态下,容器的 w 是最大的。因此,通过移动 left 和 right 指针,找到较高的 h,可以使得容水量更大。
- right 指针不变,移动 left ,找到左边第一个height[left]>height[right],在移动 left指针的过程中,要判断和更新容水量=宽度(w)×高度(h)的数值,因为在移动的过程中,h在变大,但w在逐渐减小;
- 同样,left 指针不变,移动 right ,找到左边第一个height[right]>height[left],判断和更新容水量=宽度(w)×高度(h)的数值
- 直到 left>right,结束循环
-
代码
from typing import * class Solution: def maxArea(self, height: List[int]) -> int: res = 0 left, right = 0, len(height)-1 while left<right: while left<right and height[left]<=height[right]: if min(height[left], height[right])*(right-left) > res: res = min(height[left], height[right])*(right-left) left += 1 while left<right and height[right]<height[left]: if min(height[left], height[right])*(right-left) > res: res = min(height[left], height[right])*(right-left) right -= 1 return res