给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
示例 3:
输入:height = [4,3,2,1,4]
输出:16
示例 4:
输入:height = [1,2,1]
输出:2
提示:
n = height.length
2 <= n <= 3 * 104
0 <= height[i] <= 3 * 104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
自己解答
class Solution:
def maxArea(self, height: List[int]) -> int:
# 其实就是求最大的面积
i,j=0,len(height)-1
maxM=0
for k in range(len(height)-1):
m=min(height[i],height[j]) * (j-i) #因为是装水,只能取小的一个值作为高度。 j-i 其实就是底面的宽度
if m>maxM:
maxM=m
if height[i] > height[j]: # height[i],height[j] 哪个短就不要他,换一个。因为短的那个和下一个组合起来装水更少,而长的那个和下一个组合起来可能装水更多,短的可以直接排除。
j=j-1
else:
i=i+1
return maxM
执行用时:80 ms, 在所有 Python3 提交中击败了43.53% 的用户
内存消耗:15 MB, 在所有 Python3 提交中击败了6.48% 的用户
大神解答
class Solution:
def maxArea(self, height: List[int]) -> int:
left = 0
right = len(height) - 1
maxsize = 0
while left < right:
f = right - left
if height[left] < height[right]:
h = height[left]
left = left + 1
else:
h = height[right]
right = right - 1
size = f * h
if maxsize < size:
maxsize = size
return maxsize
执行用时:72 ms, 在所有 Python3 提交中击败了68.68% 的用户
内存消耗:14.8 MB, 在所有 Python3 提交中击败了51.38% 的用户
ps :
此代码为leetcode排名靠前的他人所写
这题理清楚思路很简单