原题
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 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
解题
class Solution:
def maxArea(self, height: List[int]) -> int:
left,right = 0,len(height)-1
maxArea = 0
list1 = []
while left<right:
maxArea = (min(height[left],height[right]))*(right-left)
list1.append(maxArea)
if height[left] <= height[right]:
left += 1
else:
right -= 1
return max(list1)
分析:
双指针法
左右指针,左指针置0,右指针位于数组(height)长度-1的位置【此处位置都是下标】,初始化面积为0,建一个空的列表list,使用面积计算公式,木桶效应,面积大小由短边决定,长为,左右指针的差值right-left,高为左右指针对应数组里面最小的height[left],height[right],将面积记录更新,选出面积中最大的
- 根据较矮边的情况来移动指针,如果左边的边较矮,则将
left
指针向右移动一位;如果右边的边较矮,则将right
指针向左移动一位。
我的错误点
1、循环时指针移动未按短板决定面积的思路走
2、if height[left] <= height[right]:错误写成了left<right