11. 盛最多水的容器

题目描述

思路
这道题的思路比较简单,我们使用双指针来进行解决。
初始时我们设置左右两个指针,令l, r := 0, len(height) - 1。
然后,我们开始对整个数组进行由两侧到中间的遍历,遍历的条件就是l < r。
在遍历之前我们设置ans := 0 用于记录最终的答案。
每一次遍历的过程中,我们计算一次当前容器所能盛水的最大容量,计算公式就是curr := min(height[l], height[r]) * (r - l)。
计算之后,我们对ans进行一次更新,即:ans = max(ans, curr)。
最后,比较关键的是l和r的移动策略。我们采用贪心的思路,每一次我们想要得到的答案实际上都是尽可能大的盛水容积,而较小的一侧的高度则是水容积计算的短板,因此我们比较当前height[l]和height[r]的大小关系,如果height[l] > height[r],则令r --,否则l ++。
基于以上思路,我们写代码来解决问题。
Golang 题解
go
func maxArea(height []int) int {
ans := 0
l, r := 0, len(height) - 1
for l < r {
curr := min(height[l], height[r]) * (r - l)
ans = max(ans, curr)
if height[l] > height[r] {
r --
} else {
l ++
}
}
return ans
}
Python 题解
python
class Solution:
def maxArea(self, height: List[int]) -> int:
ans, l, r = 0, 0, len(height) - 1
while l < r:
curr = min(height[l], height[r]) * (r - l)
ans = max(ans, curr)
if height[l] > height[r]:
r -= 1
else:
l += 1
return ans