盛最多水的容器
给定 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

浙公网安备 33010602011771号