Leecode盛水最多的容器 超详细解析

问题描述:

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水

Leecode盛水最多的容器 超详细解析_第1张图片

问题分析: 初次看到这题 第一个想法就是用贪心:使得容器两侧尽可能高 中间尽可能长 却不知如何是好 后来才发现是审题错了 题目就是要求求最大面积,而不是容器内各个数值的相加  (我把柱子理解成水了......)!!审题真的很重要

根据容器的最大面积(体积)由短板决定,假设起始点x坐标为i,终点为j,板长分别是h[i],[j]

因此可得 S=min(h[i],[j])×(j-i)

不妨考虑向内移动板子(长板或短板)(对撞指针)

Leecode盛水最多的容器 超详细解析_第2张图片

 Leecode盛水最多的容器 超详细解析_第3张图片

 综上 我们希望容器尽可能大 只需要考虑短板内移的情形 求出最大面积即可

下面呈现代码:

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变大的情况?

Leecode盛水最多的容器 超详细解析_第4张图片

我是小郑 期待和你一起进步

你可能感兴趣的:(笔记,蓝桥杯,Python,python)