难度中等2872
给你
n
个非负整数a1,a2,...,a
n
,每个数代表坐标中的一个点(i, ai)
。在坐标内画n
条垂直线,垂直线i
的两个端点分别为(i, ai)
和(i, 0)
。找出其中的两条线,使得它们与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示例 3:
输入:height = [4,3,2,1,4] 输出:16示例 4:
输入:height = [1,2,1] 输出:2提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
通过次数552,246提交次数881,413
我的代码:
def maxArea(height):
n = len(height)
max = 0
for left in range(n -1):
for right in range(n):
h = height[right]
if(height[left] < height[right]):
h = height[left]
nums = h *(right -left)
if nums > max:
max = nums
return max
lt =[1,2,1]
print(maxArea(lt))
算法:类似于暴力遍历结果
运行结果:超出时间限制
参考答案:
def maxArea(height):
l, r = 0, len(height) - 1
ans = 0
while l < r:
area = min(height[l], height[r]) * (r - l)
ans = max(ans, area)
if height[l] <= height[r]: # 移动较小的那一端
l += 1
else:
r -= 1
return ans
lt =[1,2,1]
print(maxArea(lt))
方法:外层向里层移动,只有移动较小那一端,使得容器越来越高才可能容量越来越大,所以很多遍历是无用的操作。
运行结果: