问题描述:
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水
问题分析: 初次看到这题 第一个想法就是用贪心:使得容器两侧尽可能高 中间尽可能长 却不知如何是好 后来才发现是审题错了 题目就是要求求最大面积,而不是容器内各个数值的相加 (我把柱子理解成水了......)!!审题真的很重要
根据容器的最大面积(体积)由短板决定,假设起始点x坐标为i,终点为j,板长分别是h[i],[j]
因此可得 S=min(h[i],[j])×(j-i)
不妨考虑向内移动板子(长板或短板)(对撞指针)
综上 我们希望容器尽可能大 只需要考虑短板内移的情形 求出最大面积即可
下面呈现代码:
class Solution: def maxArea(self, height: List[int]) -> int: i,j=0,len(height)-1 ans=0 while i<=j: S=(j-i)*min(height[i],height[j]) ans=max(S,ans) if height[i]<=height[j]: i+=1 else: j-=1 return ans
核心就在于探索使得S变大的情况?
我是小郑 期待和你一起进步