盛最多水的容器
Posted zenan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了盛最多水的容器相关的知识,希望对你有一定的参考价值。
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
1. 题目需要理解的一点,垂直线的宽度忽略不计,也就是说width = n -1
2. 一开始并没有什么好的方法,后来才意识到其实这题的关键在于隐藏信息
class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ max_area = 0 length = len(height) x_tmp = -1 y_tmp = -1 for i in range(length-1): x = height[i] if x>x_tmp: y_list = [i for i in range(i+1,length)][::-1] for j in y_list: y = height[j] if y>y_tmp: area = min(height[i],height[j])*(j-i) if area>max_area: max_area = area else: continue else: continue return max_area
上述代码先从两端开始,因为宽度是逐渐减小的,因此必须使得高度是增加的,因此仅在后者高度大于前者,才计算area。
然而时间复杂度还是O(n*n),是不符合题目要求的。
正解:
其实是我们忽略了一个隐藏条件,因为根据短板效应,实际上我们需要增大的是短的那块板,因此还可以提高速度。
class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ max_area = 0 left = 0 right = len(height) - 1 while 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
以上是关于盛最多水的容器的主要内容,如果未能解决你的问题,请参考以下文章