今天图解的题目来源于 LeetCode 第 11 号问题:盛最多水的容器。这是一道可以使用双指针 的技巧来解题的经典题目。
题目描述
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与x 轴共同构成的容器可以容纳最多的水。
注意:你不能倾斜容器,n 至少是2。
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
"""
逼近法
每次左右两端都舍去短的那一端
若选择短的那一端【S=小于等于此端的高*小于等于当前的最大区间长度】
至多的面积也是选择最左最右的一个矩形,因此不必再考虑短的一端,直接舍去逼近
"""
# 记录当前最大容量的面积
max_area = 0
# 记录最左边的下标
left = 0
# 记录右边的下标
right = len(height) - 1
# 当右边下标大于左边下标的时候循环
while right > left:
# 当前循环中最大的容量面积,使用max方法比较上次的max_area和此次的容量面积,取最大值
# min(height[left], height[right]) * (right - left) 取左边和右边的高当中的最小值, 下标right-left为宽,两者相乘为最大面积
max_area = max(max_area, min(height[left], height[right]) * (right - left))
# 判断哪条高小,小的那边下标进行操作
if height[right] > height[left]:
left += 1
else:
right -= 1
return max_area
if __name__ == '__main__':
test = Solution()
list = [1,8,6,2,5,4,8,3,7]
result = test.maxArea(list)
print(result)
本文介绍LeetCode第11题“盛最多水的容器”的解决方案,采用双指针技巧,逐步逼近最大面积,通过代码实现并给出示例。
1138

被折叠的 条评论
为什么被折叠?



