思路就是左右指针。
初始是左指针在数组开头,右指针在结尾。
当我们往内收指针的时候,矩形的长(我们看作横坐标)会缩小。要使矩形面积变大,只有当宽度增加的时候才有可能。而且由于短板效应,宽度会取决于短的那条挡板。所以如果你的上限是你的短的那一条。而你必须要改变你的上限,才会使得总体面积变大。你移动长的那条挡板,结果永远不会比现在好,为什么?因为矩形长缩小,宽度不会变化甚至可能会变小,面积肯定不会变大。但如果你移动短的那根挡板,如果移动到更长的,你的面积才会有可能变大。所以直接排除了不可能成为面积最大值的状态了。
当左右挡板相等呢?要使面积变大,那中间可能又有两根比左右更长的挡板才有可能。然后不管谁先移动,左挡板最终回到最边更长,右挡板最终回到右边更长。所以不会有遗漏。
其实就是不断消去不可能为最大值的状态。
class Solution:
def maxArea(self, height: List[int]) -> int:
left = 0
right = len(height) - 1
max_area = 0
while left < right:
max_area = max(max_area, (right-left) * min(height[right], height[left]))
if height[right] > height[left]:
left += 1
else:
right -= 1
return max_area