-
题目:给定一个长度为
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。
# 示例二
输入:height = [1,1]
输出:1
- 提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
- 思路:
按照顺序依次遍历计算出每个区间的容积大小,更新最大值。但是提交的时候超时了,通过请见解法二
- 解法一暴力解法:
class Solution:
def maxArea(self, height):
height_sum = 0
for i in range(len(height)):
for j in range(i, len(height)):
if height[j] > height[i]:
height_1 = height[i] * (j-i)
elif height[j] <= height[i]:
height_1 = height[j] * (j - i)
if height_1 > height_sum:
height_sum = height_1
# print(height[j])
return height_sum
- 思路:
由于暴力解决超时了,所以考虑到了双指针,双指针对前后区间按照筛选掉小的一边的策略进行缩小,并不改变最大值,更新其最大值进行返回。
- 解法二双指针:
class Solution:
def maxArea(self, height):
height_sum = 0
start, end = 0, len(height)-1
while start != end:
if height[start] > height[end]:
height_tar = height[end] * (end-start)
end -= 1
elif height[start] <= height[end]:
height_tar = height[start] * (end-start)
start += 1
if height_tar > height_sum:
height_sum = height_tar
return height_sum
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/container-with-most-water ↩︎